NodeJS最佳实践:流量控制的错误?

jed*_*ung 5 javascript conventions node.js sails.js

在Node.js中,我应该使用错误进行流量控制,还是应该像异常一样使用它们?

我正在Sails.js中编写一个身份验证控制器和一些单元测试,目前,我的注册方法检查是否存在具有相同用户名的用户.如果用户已经存在用户名,我的模型方法会使用新的Error对象调用其回调参数,如下所示:

模型:

exists: function (options, cb) {
    User.findOne({
        where: { username: typeof options === 'Object' && options.username ? options.username : options },
    }).exec(function (err, user) {
        if (err) return cb(err);
        if (user) return cb(new Error("A user with that username already exists."));
        cb(null, !!user);
    });
},
Run Code Online (Sandbox Code Playgroud)

控制器:

User.exists(req.body.user.username, function (err, exists) {
  if (err) {
    console.log("error: ", err);
    return res.status(409).json({
      message: err
    });      
  }

  User.create(req.user).then(function (data) {
    res.status(201).json({
      user: data
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

这是最佳做法吗?我不确定节点约定是否支持异常情况或流量控制的错误.我想我应该改写这个,但是在我这样做之前我想知道惯例.我想我已经在Sails中看到过这样写的一些例子.谢谢!

sgr*_*454 2

上面的答案对于 Express 来说很好,但是在 Sails 控制器中你不应该调用next; 最佳实践是始终返回响应。在大多数 Sails 示例代码中,您甚至不会将其next视为控制器操作函数的参数。另请注意,Sails 附带了一些内置于对象中的默认响应方法res,例如res.serverErrorres.badRequest,以及res.negotiate它们将尝试根据状态代码将错误路由到适当的处理程序。所以你的例子可以调整为:

模型:

exists: function (options, cb) {
    User.findOne({
        where: { username: typeof options === 'Object' && options.username ? options.username : options },
    }).exec(function (err, user) {
        // res.negotiate will default to a 500 server error
        if (err) return cb(err);
        // res.negotiate will just output the status code and error object
        // as JSON for codes between 400 and 500, unless you 
        // provide a custom view as api/responses/badRequest.ejs
        if (user) return cb({
          status: 409, 
          message: "A user with that username already exists."
        });
        cb(null, !!user);
    });
},
Run Code Online (Sandbox Code Playgroud)

控制器:

User.exists(req.body.user.username, function (err, exists) {
  // Let Sails handle those errors for you
  if (err) {return res.negotiate(err);}

  User.create(req.user).then(function (data) {
    res.status(201).json({
      user: data
    });
  });
});
Run Code Online (Sandbox Code Playgroud)