0

我在分离我们的移动应用程序和 Web 界面的 api 调用时遇到了很大的麻烦,基本上代码是相同的,但响应应该不同(html 用于 web 和 json 用于来自应用程序的 api 调用)

所以现在我有这样的路由:

  app.post('/post', auth.needed, posts.create)
  app.post('/addPost', posts.createJson)

第一个用于网络应用程序,第二个用于

但是“posts.create”中的逻辑是相同的,它基本上是上传图像并将帖子保存到数据库,现在我已经复制了代码并寻求结构化建议如何正确执行此操作以及类似情况的最佳实践是什么谢谢!

exports.create = function (req, res) {
  var post= new Post(req.body)
  post.user = req.user
  //custom logic 
  post.uplSave(req.files.image, function (err) {
    if (!err) {
      return res.redirect('/posts/'+post._id)
    }
  }
}

exports.createJson = function (req, res) {
  var post = new Post(req.body)
  post.user = req.user
  //custom logic 
  post.uplSave(req.files.image, function (err) {
    if (!err) {
      res.json({
        data: post,
      })
    }
  }
}
4

1 回答 1

2

听起来您可以从 using 中受益res.format,因此您可以重用您的处理程序:

exports.create = function (req, res) {
  var post  = new Post(req.body);
  post.user = req.user;
  post.uplSave(req.files.image, function (err) {
    if (err)
      return res.send(500); 
    res.format({
      default : function() {
        res.redirect('/posts/' + post._id);
      },
      json    : function() {
        res.json({ data : post });
      }
    });
  });
}

如果客户端明确告诉服务器它需要 JSON 响应(使用Accept: application/json标头),则服务器将返回 JSON。否则(default情况)它将生成重定向。

由于这取决于客户端执行 The Right Thing™,而您的情况可能并非如此,另一种解决方案是为您的处理程序创建一个部分函数,​​将返回类型作为固定参数传递:

app.post('/post', auth.needed, posts.create.bind(posts, 'default'));
app.post('/addPost', posts.create.bind(posts, 'json'));

// your handler would look like this:
exports.create = function(type, req, res) {
  ...
  if (type === 'json')
    return res.json(...);
  return res.redirect(...);
};
于 2013-11-03T15:29:58.767 回答