0

我是 Node.js 的新手。我将它用作 iPhone 客户端的服务器后端。我正在使用 JSON 调用 POST:{firstname: "bob", email : bob@someemail.com}

node.js 代码如下所示(使用 Express 和 Mongoose):

var User = new Schema({
    firstname   : { type: String, required: true}
    , email     : { type: String, required: true, unique : true}

});
var User = mongoose.model('User', User);

对于 POST,

app.post('/new/user', function(req, res){

    // make a variable for the userData
    var userData = {
        firstname: req.body.firstname,
        email: req.body.email
    };

    var user = new User(userData);

    //try to save the user data
    user.save(function(err) {
        if (err) {
            // if an error occurs, show it in console and send it back to the iPhone
            console.log(err);
            res.json(err);
        }
        else{
            console.log('New user created');
        }
    });

    res.end();
}); 

现在,我正在尝试使用相同的电子邮件创建重复用户。由于我对电子邮件的“独特”约束,我希望这会引发错误——确实如此。

但是,node.js 进程以“错误:发送后无法设置标头”而终止。

我希望能够在诸如此类的情况下将消息发送回 iPhone 客户端。例如,在上面,我希望能够将 JSON 发送回 iphone,说明新用户创建的结果(成功或失败)。

谢谢!

4

2 回答 2

3

这是因为您的代码的异步性质。在你res.end()的回调函数之前运行user.save应该把res.end()回调放在里面(最后)。

这边走:

  user.save(function(err) {
    if (err) {
        // if an error occurs, show it in console and send it back to the iPhone
        console.log(err);
        return res.json(err);
    }
    console.log('New user created');
    res.end();
});
于 2013-02-14T08:39:49.457 回答
2

使用适当的 http 状态发送错误,您有很多 4xx 可以做到这一点。

 res.json(420, err);

这样,您只需解析 http fetch 中的消息,使用 jquery 它会给出如下内容:

jQuery.ajax({
  ...
  error: function (xhr, ajaxOptions, thrownError) {
    if(xhr.status == 420) {
      JSON.parse(xhr.responseText);
    }
  }
于 2013-02-14T08:41:42.050 回答