使用node.js和sequelize将表单数据插入到mysql数据库表中

时间:2014-11-07 10:13:59

标签: javascript mysql node.js

我有一个NodeJS应用,我希望使用MySQL方法将表单中的一些数据插入到sequelize() - 数据库的表中。

所以这是我的表格

<form id="addVideo" method="post">
    <input type="url" name="video_url" required></input>
    <input type="hidden" value="" name="artist_id"></input>
    <input type="hidden" value="youtube" name="type"></input>
</form>

我的帖子功能:

$('form#addVideo').submit(function(e){
    e.preventDefault();

    var form = $(this);
    var jsonvideoFormData = utils.serializeToJSON(form);
    var xhrData = _.pick(jsonvideoFormData, 'video_url', 'artist_id', 'type');

    api.post('/videos', xhrData, function(response){
       alert('Video has been added!');
    });
});

然后后端代码如下所示:

exports.addVideo = function(req, res, next){

  var videoURL = req.body.video_url;
  var artistId = req.body.artist_id;
  var type = req.body.type;

  db.sequelize.query('INSERT INTO social_urls (artist_id,urls,type) VALUES('artistId','videoURL','type')', function(err) {
    if(err){
        return res.json(400, {response: {code: 400, message:'An error appeared.'}});
    } else{
       console.log('succes');
       res.json(201, {response: {code: 201, message: 'Video has been added'}});
    }   

  });

}

但由于某种原因,我不知道这不起作用。任何人都可以帮助我吗?

非常感谢!!

3 个答案:

答案 0 :(得分:2)

我不是sequelize的专家,但我发现代码容易出现SQL注入。

这是错误的:

db.sequelize.query('INSERT INTO social_urls (artist_id,urls,type) VALUES('artistId','videoURL','type')', function(err)

应该是,至少:

db.sequelize.query("INSERT INTO social_urls (artist_id,urls,type) VALUES('" + artistId + "','" + videoURL + "','" + type + "')'", function(err)

但实际上,我认为你应该这样做:

var SocialUrl = sequelize.define('SocialUrl', {
  videoURL: Sequelize.STRING,
  artistId: Sequelize.STRING,
  type:     Sequelize.STRING
}, {
  tableName: 'social_urls',
  timestamps: false
});

SocialUrl
  .create({
    videoURL: videoURL,
    artistId: artistId,
    type: type
  })
  .complete(function(err, socialUrl) {
    if (err) {
      // log error;
    } else {
      // Do stuff
    }
  })

答案 1 :(得分:1)

这是保存数据的实际查询。第2步&amp; 3.

  var videoURL = req.body.video_url;
  var artistId = req.body.artist_id;
  var type = req.body.type;

    models.socialUrls.build({ 
            artist_id: artistId, 
            urls: videoURL, 
            type: type
        })
          .save()
          .then(anotherTask => {
            console.log('the data saved!');
            // you can now access the currently saved task with the variable anotherTask... nice!
          })
          .catch(error => {
            console.log('uh oh something wasn't right!');
            console.log(error);
            // Ooops, do some error-handling
          })

如果您在这里查看了续集文档: http://docs.sequelizejs.com/manual/tutorial/instances.html

保存数据有3个步骤。

  1. 创建模型
  2. 在回调中创建实例,a.k.a数据对象。这是发送到sequelize方法发送给db的内容。
  3. 调用.save()方法。
  4. 之后,您可以使用.catch()

    处理错误

    从您的后端代码中看出您的问题。确保您的模型正确无误并且表单中的数据已发送。一旦你确定,你只需要做第2步和第3步。

答案 2 :(得分:0)

您没有JSON序列化数据。你可以发布数据。

<form id="addVideo" method="post" action="/videos">
    <input type="url" name="video_url" required></input>
    <input type="hidden" value="" name="artist_id"></input>
    <input type="hidden" value="youtube" name="type"></input>
</form>

记得使用body-parser

app.use(require("body-parser")());

现在req.body.video_url应该有预期的数据。