如何从节点应用程序返回错误,以便$ post.fail()捕获它们

时间:2016-01-22 00:28:08

标签: node.js express bluebird

我有一个简单的聊天应用程序。在index.html中,我有一个带有id" nick"的输入的表单。当我提交此表单时,如果此用户在聊天室中已经存在,我想创建一个用户。如果用户确实存在(或者存在其他错误),我希望能够显示有用的错误消息。

我在这里列出了执行此操作的3段代码。

我想使用$ post.fail()在index.html中处理用户创建中的任何错误。我怎样才能做到这一点?按照目前的情况,如果用户已经存在,Express会在行上抛出以下异常"抛出新错误('用户已存在');":

"未处理拒绝错误:用户已存在于c:\ Users \ Matt \ Documents \ code \ chat \ app \ routes \ room.js:24:19"

这是否意味着我应该在某处调用Promise.reject()?是否有一种返回错误的标准方法,以便$ post.fail()?

捕获它们

的index.html

$('#myform').submit(function() {
    $.post(window.location.href + 'users/create', { nickname: $('#nick').val() })
    .done(function(res) {
        // user created successfully
    })
    .fail(function() {
        // user create failed
        // show error message
    });
    return false;
});

room.js - 房间模型

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var roomSchema = new mongoose.Schema({
    name: { type: String, required: true, trim: true, index: { unique: true } },
    users: [{ type: String, required: true, trim: true }]
});

module.exports = mongoose.model('Room', roomSchema);

room.js - 房间路线

var express = require('express');
var jwt = require('jsonwebtoken');
var config = require('../../config');
var Room = require('../models/room');

var router = express.Router();

router.post('/create', function(req, res) {
    var promise = Room.findOne({ name: req.roomname }).exec();

    promise.then(function(room) {
        if (!room) {
            var newRoom = Room({
                name: req.roomname,
                users: []
            });
            return newRoom.save();
        }
        return room;
    })
    .then(function(room) {
        if (room.users.indexOf(req.body.nickname) > -1) {
            throw new Error('user already exists');
        } 
        room.users.push(req.body.nickname);
        return room.save();
    })
    .then(function(room) {
        var token = jwt.sign(req.body.nickname, config.secret); 
        return res.json({ nickname: req.body.nickname, token: token });   
    })
    .catch(function(err) {
        throw err; // I want any errors to bubble back up to the fail() in index.html so I can display a message
    });
});

module.exports = router;

1 个答案:

答案 0 :(得分:0)

对于因内部处理错误而被视为失败的请求,您应返回5xx作为响应状态。



    .catch(function(err) {
        res.status(500).json({ error: err });
    });
 




https://www.ietf.org/rfc/rfc2616.txt

  

10.5服务器错误5xx

     

以数字" 5"开头的响应状态代码表明案件   服务器知道它有错误或无法执行   执行请求。除了响应HEAD请求时,   服务器应该包括一个包含对的解释的实体   错误情况,以及是暂时的还是永久的   条件。用户代理应该显示任何包含的实体到
  用户。这些响应代码适用于任何请求方法。