【问题标题】:node.js - can't access variables in mongoose save callbacknode.js - 无法访问猫鼬保存回调中的变量
【发布时间】:2018-01-19 16:46:16
【问题描述】:

我正在尝试使用 mongoose 将我的数据保存到 mongodb,然后发送 json 响应。 这是我的代码

var userdata = {
  name: req.body.name,
  username: req.body.username,
  email: req.body.email,
  password: req.body.password,
};

var resdata = {};

var user = new User(userdata);
user.save(function (error) {
  if(error) {
    if (error.name === 'MongoError' && error.code === 11000) {
      resdata =  { 
        status: false,
        errortype: 'db-error',
        message:  "Duplicate Key Error"
      };
    } else {

      resdata =  { 
        status: false,
        errortype: 'db-error',
        message:  error.message
      };
    }
  } else {

    resdata =  {
      status: true,
      message:  "User Registered Successfully.." 
    };
  }
});
res.send(resdata);

问题是我无法在保存回调之外访问 resdata 的值。它总是返回 {}。我该怎么办?

【问题讨论】:

    标签: node.js mongodb express mongoose callback


    【解决方案1】:

    您必须在查询的回调中向客户端发送数据,这是一个示例:

    user.save(function (error) {
        if(error) {
            if (error.name === 'MongoError' && error.code === 11000) {
    
                res.json({
                    status: false,
                    errortype: 'db-error',
                    message:  "Duplicate Key Error"
                });
    
            } else {
    
                res.json({
                    status: false,
                    errortype: 'db-error',
                    message:  error.message
                });
            }
        } else {
    
            res.json({
                status: true,
                message:  "User Registered Successfully.." 
            });
    
        }
    });
    

    【讨论】:

    • 我已经想到了,但是有什么办法可以在回调之外发送数据?
    • User.save() 是异步的,这意味着您应该等到查询完成,然后根据其结果发送您的响应(即是否有错误)
    • 阅读这篇article 了解nodejs的异步特性
    • res 变量在回调中不起作用。没有返回响应
    • 你在 express 中间件中使用 save 方法吗?请显示整个代码
    【解决方案2】:

    这是我的完整代码 server.js

    import express from 'express';
    import morgan from 'morgan';
    import mongoose from 'mongoose';
    import router from './router';
    
    // Connect to MongoDB
    mongoose.connect('mongodb://localhost:27017/myapp');
    
    // Initialize http server
    const app = express();
    
    // Logger that outputs all requests into the console
    app.use(morgan('combined'));
    // Use v1 as prefix for all API endpoints
    app.use('/', router);
    
    // Launch the server on port 3000
    const server = app.listen(3000, () => {
      const { address, port } = server.address();
      console.log(`Listening at http://${address}:${port}`);
    });
    

    router.js

    import express, { Router } from 'express';
    // Import register action from movies controller
    import register  from './controllers/register';
    import validator from 'express-validator';
    
    // Initialize the router
    const router = Router();
    
    var bodyParser = require('body-parser');
    
    router.use(bodyParser.json()); // support json encoded bodies
    router.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
    router.use(validator());
    
    // Handle /movies.json route with register action from movies controller
    router.post('/register', register.registerUser);
    
    export default router;
    

    register.js

      import mongoose from 'mongoose';
      import User from '../models/user';
    
      // Connect to MongoDB
      mongoose.connect('mongodb://localhost:27017/myapp', {useMongoClient: true});
    
      exports.registerUser = function(req, res) {
    
        req.checkBody('name', 'Name is required').notEmpty();
        req.checkBody('username', 'Username is required').notEmpty();
        req.checkBody('email', 'Email is required').notEmpty();
        req.checkBody('email', 'Email does not appear to be valid').isEmail();
        req.checkBody('password', 'Password is required').notEmpty();
    
        // check the validation object for errors
        var errors = req.validationErrors();
    
        console.log(errors);
    
        var resdata = {};
    
        if (errors) {
    
          resdata =  { 
            status: false,
            errortype: 'validation',
            message:  errors 
          };
    
          res.send(resdata);
        } else {
    
          var userdata = {
            name: req.body.name,
            username: req.body.username,
            email: req.body.email,
            password: req.body.password,
          };
    
          var user = new User(userdata);
          user.save(function (error) {
    
            var resdata = {};
            if(error) {
              if (error.name === 'MongoError' && error.code === 11000) {
                resdata =  { 
                  status: false,
                  errortype: 'mongoose-error',
                  message:  "Duplicate Key Error"
                };
              } else {
    
                resdata =  { 
                  status: false,
                  errortype: 'mongoose-error',
                  message:  error.message
                };
              }
            } else {
    
              resdata =  {
                status: true,
                message:  "User Registered Successfully.." 
              };
            }
    
            res.send(resdata);
          });
        }
      };
    

    【讨论】:

    • 这就是我从一开始就告诉你要做的事情send data in the save callback
    • 是的.. 但是在回调内部时它仍然没有发送任何响应
    • 不知道为什么,但代码现在可以工作了。非常感谢。
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2014-12-05
    • 2016-02-09
    • 2013-08-05
    • 1970-01-01
    • 2021-09-25
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多