Graphql Mutation обновляет данные пользователя, но меняет пароль, и я не могу войти после выхода - PullRequest
0 голосов
/ 08 января 2019

Я новичок, так что извините, если это выглядит как беспорядок. Каждый раз, когда я запускаю мутацию, я проверяю mlab, и он работает ... пользователь обновляется, но после выхода из системы ... я не могу войти в систему. .но я не уверен, как это исправить. Возможно, пароль необходимо отправить вместе с запросом ... Я отправляю идентификатор? Local.password не в реквизитах ...

Вот мой server.js

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const graphqlHTTP = require('express-graphql');
const graphqlSchema = require('./server/GQL/schema.js');


//added for auth start
const morgan = require('morgan');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const dbConnection = require('./server/db'); 
const passport = require('./server/passport');
const cors = require('cors');

const app = express();

// allow cross-origin requests
app.use(cors());

const port = process.env.PORT || 5000;

// ===== Middleware ====
app.use(morgan('dev'));
app.use(
  bodyParser.urlencoded({
    extended: false,
  })
);
app.use(bodyParser.json());
app.use(
  session({
    secret: process.env.APP_SECRET || 'this is the default passphrase',
    store: new MongoStore({ mongooseConnection: dbConnection }),
    resave: false,
    saveUninitialized: false,
  })
);


// ===== Passport ====
app.use(passport.initialize());
app.use(passport.session()); // will call the deserializeUser



// bind express with graphql
app.use('/graphql', cors(), (req, res, next) =>{
  console.log(req.session);
  return graphqlHTTP({
    schema: graphqlSchema,
    graphiql: true,
    context: { user: req.user },
    tracing: true,
    cacheControl: true,
    formatError: error => ({
      message: error.message,
      locations: error.locations,
      stack: error.stack ? error.stack.split('\n') : [],
      path: error.path,
  }),
})(req, res, next);
});


// API calls
app.get('/api/hello', (req, res) => {
  res.send({ express: 'Hello From Express' });
});

app.get('/api/goodbye', (req, res) => {
  res.send({ express: 'Goodbye From Express' });
});

if (process.env.NODE_ENV === 'production') {
  // Serve any static files
  app.use(express.static(path.join(__dirname, 'client/build')));

  // Handle React routing, return all requests to React app
  app.get('*', function(req, res) {
    res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
  });
}



app.use('/auth', require('./server/auth'));

app.listen(port, () => console.log(`Listening on port ${port}`));

Я использовал graphql-mongoose-compose для своей схемы:

У меня тогда есть мутация, похожая на:

mutation userUpdateById($id: MongoID!, $firstName: String, $lastName: String,
  $username: String, $email: String,$bio: String, 
  $phone: String, $street: String, $city: String,
  $state: String,$zipcode: String, $country: String){
    userUpdateById(record: {
      firstName: $firstName,
      lastName: $lastName, 
        local: {
          username: $username,
          email: $email,
        }
        bio: $bio,
        phone: $phone,
        address:{
          street: $street,
          city: $city,
          state: $state,
          zipcode: $zipcode,
          country:$country,
        }
        _id: $id,
    })...
`

Тогда у меня есть следующие способы сохранения пользователя:

UserSchema.methods = {
  checkPassword: function(inputPassword) {
    return bcrypt.compareSync(inputPassword, this.local.password);
  },
  hashPassword: plainTextPassword => {
    return bcrypt.hashSync(plainTextPassword, 10);
  },
};

// Define hooks for pre-saving
userSchema.pre('save', function(next) {
  if (!this.local.password) {
    console.log('=======NO PASSWORD PROVIDED=======');
    next();
  } else {
    this.local.password = this.hashPassword(this.local.password);
    next();
  }

});

1 Ответ

0 голосов
/ 09 января 2019

Проблема связана с мутацией, созданной graphql-compose-mongoose. Мутация userUpdateById обновляет все поля документа. В настоящее время это открытая проблема в репозитории gcm. Другой пользователь предложил использовать userUpdateMany с передачей user_id в поле фильтра в качестве достаточного обходного пути; однако полезная нагрузка сообщает только количество обновленных пользователей. Не большая проблема, если вы просто получаете данные с помощью запроса. Я попробовал это.

...