无法正确处理 Sails.js 中的 POST 请求

Cannot process POST request in Sails.js correctly

我正在尝试将评论功能添加到我的 Sails.js 博客应用程序中。但是,我似乎没有正确编写我的控制器操作。

当我提交评论表单时,页面开始重新加载,但没有完成重新加载。

这是我的控制器代码:

const gravatar = require('gravatar');

module.exports = {

    blog: (req, res) => {
        Post.find({}).exec((err, posts) => {
            if (err) {
                res.send(500, { error: 'Database Error' });
            }

            res.view('all-posts', { posts });
        });

    },

    singlePost: (req, res) => {
        Post.findOneBySlug(req.params.slug).exec((err, post) => {
            if (err) {
                res.send(500, { error: 'Database Error' });
            }

            res.view('single-post', {
                post,
                gravatar: gravatar.url
            });
        });
    },

addComment: (req, res) => {
    const {
        name, comment, email,
        url, slug,
    } = req.allParams();

    Post.findOneBySlug(slug).exec((err, post) => {
        if (err) {
            return res.send(500, { error: 'Database Error' });

            Comment.create({
                body: comment, name, email, website: url
            }).exec((error, comment) => {
                if (error) {
                    return res.send(500, { error: 'Database Error' });
                }
                console.log(comment);
                post.comments.addComment({slug, comment});
                post.save();

                res.redirect(`/${slug}`);
            });
        }
    });

    return false;
},

};

这是我的 routes.js 文件:

module.exports.routes = {
  'get /blog': 'BlogController.blog',

  'get /:slug': 'BlogController.singlePost',

  'post /:slug/new-comment': 'BlogController.addComment'
};

这是我的模型Post.js

module.exports = {

  identity: 'Post',

  attributes: {

    title: {
      type: 'string',
      required: true,
      unique: true
    },

    body: {
      type: 'string'
    },

    categories: {
      type: 'string',
      required: true
    },

    imageUrl: {
      type: 'string'
    },

    comments: {
      collection: 'Comment',
      via: 'post'
    },

    slug: {
      type: 'slug',
      from: 'title',
      blacklist: ['search', 'blog', 'contacts']
    }
  },

  addComment: (options, cb) => {
    Post.findOneBySlug(options.slug).exec((err, post) => {
      if (err) return cb(err);
      if (!post) return cb(new Error('Post not found.'));

      post.comments.add(options.comment);
      post.save(cb);
    })
  },

  connection: 'mongodb'
};

因此,当我在 /:slug 页面上提交评论表单时,实际上没有任何反应接受页面尝试重新加载。在数据库中也没有任何保存。

表单参数是从表单发送的,所以在客户端应该没问题。


我如何正确处理此 post 请求?

您需要在每个 res.send(500, ...); 调用之前添加 return 语句,因为目前,在错误的情况下,您的代码尝试发送两次响应,而客户端没有得到实际错误的响应:

if (err) {
  return res.send(500, { error: 'Database Error' });
}
... rest code

我怀疑,数据库中没有保存任何内容的原因是请求正文中的参数无效。