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

Node.js 如何从节点应用程序返回错误,以便$post.fail()捕获这些错误,node.js,express,bluebird,Node.js,Express,Bluebird,我有一个简单的聊天应用程序。在index.html中,我有一个带有id为“nick”的输入的表单。当我提交此表单时,如果聊天室中还没有此用户,我希望创建一个用户。如果用户确实存在(或者存在其他错误),我希望能够显示一条有用的错误消息 在这里,我列出了实现这一点的3段代码 我想使用$post.fail()处理index.html中用户创建过程中的任何错误。我该怎么做?目前,如果用户已经存在,Express会在“抛出新错误('user ready exists');”行上抛出以下异常: “未处理的拒

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

在这里,我列出了实现这一点的3段代码

我想使用$post.fail()处理index.html中用户创建过程中的任何错误。我该怎么做?目前,如果用户已经存在,Express会在“抛出新错误('user ready exists');”行上抛出以下异常:

“未处理的拒绝错误:用户已存在于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;

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

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