【问题标题】:Node + Express: does not invoke callback after posting data to databaseNode + Express:将数据发布到数据库后不调用回调
【发布时间】:2015-11-12 05:51:31
【问题描述】:

我是 node.js 的新手,正在使用 Express 和 Sequelize 构建一个 restful api。现在我只需要通过以下代码创建一个用户:

router.post('/preregister', function(req, res, next) {
    models.users.create(req.body, function(err, user) {
        console.log('req: ' + req.body);
        if (err) res.json(err);
        res.json(user);
    });
});

系统输出sql语句,我可以看到数据是通过查询数据库创建的,但是服务器挂在那里,不再做任何事情,甚至没有打印出'req'行就在if之前语句,看起来好像 function(err, user) 部分从未被触及。看起来一些基本的东西是错误的。但是缺少什么??

编辑

用户模型定义如下:

"use restrict";

module.exports = function(sequelize, Sequelize) {
    var users = sequelize.define('users', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: false,
            isUnique: true,
            field: 'id' 
        },
        email: {
            type: Sequelize.STRING,
            isUnique: true,
            allowNull: false,
            validate: {
                isEmail: true
            },
            field: 'email'
        }
    }, {
        freezeTableName: true
    });

    return users;
};

【问题讨论】:

  • 请在 if 语句之前尝试 console.log(err)。而且我认为问题在于,如果出现错误,您不会发回响应。您仅在成功的情况下发送响应,而不是在错误的情况下发送响应。所以首先,尝试 console.log(err),如果它打印意味着你的回调被调用。然后再做 res.json(err) 以防出错,那么你的服务器就不会挂起
  • @Abie 不幸的是 res.json(err) 没有输出任何东西 - 看起来回调没有被调用..

标签: node.js express


【解决方案1】:
router.post('/preregister', function(req, res, next) {
    models.users.create(req.body, function(err, user) {
        if (err) res.json(err);
        res.json(user);
    });
});

【讨论】:

  • 不幸的是 res.json(err) 甚至没有被调用,因为服务器仍然挂起但没有输出。我在 if 语句之前尝试了 console.log(err) ,但它甚至没有被打印出来。
  • 仅用于在 if 条件之前调试使用console.log(user);console.log(req.body);。评论输出
  • 嗨 Mahesh,我确实将 console.log 行放在 if 语句之前,但它们没有输出任何内容,这让我相信回调没有被调用..
【解决方案2】:

Sequelize 在其最新版本中使用Promises

router.post('/preregister', function(req, res, next) {
    var user = models.users.build(req.body);
        user.save()
        .complete(function(err) {
            if (err) return next(err);
            res.json(user);
        });
});

【讨论】:

  • 在我在 build(req.body) 之后删除了半列之后,您提供的内容似乎给出了“未定义不是函数” - 仅供参考,我正在使用 sequelize 3.5.1。
  • 检查我忘记调用模型的编辑user.save()
  • hmm,仍然给出 500 状态码和“未定义不是函数”的东西。我需要使用除“express”和“../models”之外的任何其他要求吗?
  • 请告诉我哪个函数未定义(哪行代码),并请确保您定义的模型正确var User = sequelize.define('user', { username: Sequelize.STRING, description: Sequelize.TEXT })
  • 嗨,hussam,我刚刚用用户模型更新了 OP。错误堆栈跟踪没有指定哪一行给出了异常,所以我不知道如何判断 - 返回的结果是:

    undefined is not a function

       它来自默认的error.jade。从服务器日志中,它说:POST /users/preregister 500 415.619 ms - 178 这就是我所拥有的......
【解决方案3】:

Sequelize 使用(修改版)bluebird promises 库,这意味着它应该可以工作:

router.post('/preregister', function(req, res) {
  models.users.create(req.body).then(function(user) {
    res.json(user);
  }).catch(function(err) {
    console.error(err);
    res.sendStatus(500);
  });
});

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 2016-04-26
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多