如何在 node.js 中使用 token(post) Mysql?

Posted

技术标签:

【中文标题】如何在 node.js 中使用 token(post) Mysql?【英文标题】:How do I use token(post) Mysql with node.js? 【发布时间】:2015-04-04 05:52:58 【问题描述】:

我是一个新手程序员。我一直在做一个非常小的网站。我遇到了小错误。我找到了一些解决方案。但我还没有答案。

如果你不介意,请给我你的touhgt。 T^T

我将 node.js 与 mysql 连接起来。 'GET' 运行没有任何问题。但“POST”部分无法获取我在网页上键入的一些数据。

我想知道为什么'POST' 没有得到数据。

var fs = require('fs');
var ejs = require('ejs');
var http = require('http');
var mysql = require('mysql');
var express = require('express');

var client = mysql.createConnection(
  user: 'root',
  password: 'PASSWORD',
  database: 'Company'
);

var app = express();

http.createServer(app).listen(8080, function()
  console.log('Server running at http://127.0.0.1:8080');
);

app.get('/', function(request, response) 
  fs.readFile('list.html', 'utf8', function(error, data) 
    client.query('SELECT * FROM products', function (error, results) 
       response.send(ejs.render(data, 
        data: results
      ));
    );
  );
);


app.get('/delete/:id', function(request, response)  
  client.query('DELETE FROM products WHERE id=?', [request.param('id')], function() 
    response.redirect('/');
  );
);

app.get('/insert', function(request, response)  
  fs.readFile('insert.html', 'utf8', function (error, data) 
  response.send(data);
  );
); 

app.post('/insert', function(request, response) 
  var body = request.body;

  client.query('INSERT INTO products (name, modelnumber, series) VALUES (?, ?, ?)'[
    body.name, body.modelnumber, body.series
    ], function() 
      response.redirect('/');
  );
);

app.get('/edit/:id', function(request, response)  
  fs.readFile('edit.html', 'utf8', function(error, data) 
    client.query('SELECT * FROM products WHERE id = ?', [
      request.param('id')
    ], function(error, result) 
      response.send(ejs.render(data, 
        data: result[0]
      ));
    );
  );
);

app.post('/edit/:id', function(request, response)  
  var body = request.body;

  client.query('UPDATE products SET name=?, modelnumber=?, series=? WHERE id=?', [
    body.name, body.modelnumber, body.series, request.param('id')
    ], function() 
      response.redirect('/');
    );
);

错误信息

TypeError:无法读取未定义的属性“名称” 在 app.get.fs.readFile.client.query.response.send.ejs.render.data (/home/han/app.js:46:9) 在回调(/home/han/node_modules/express/lib/router/index.js:164:37) 在参数(/home/han/node_modules/express/lib/router/index.js:138:11) 通过(/home/han/node_modules/express/lib/router/index.js:145:5) 在 Router._dispatch (/home/han/node_modules/express/lib/router/index.js:173:5) 在 Object.router (/home/han/node_modules/express/lib/router/index.js:33:10) 在下一个(/home/han/node_modules/express/node_modules/connect/lib/proto.js:193:15) 在 Object.expressInit [作为句柄] (/home/han/node_modules/express/lib/middleware.js:30:5) 在下一个(/home/han/node_modules/express/node_modules/connect/lib/proto.js:193:15) 在 Object.query [作为句柄] (/home/han/node_modules/express/node_modules/connect/lib/middleware/query.js:45:5)

当我尝试将数组值更改为 'value' app.post('/insert') 部分时,网页显示为 'value'。

【问题讨论】:

【参考方案1】:

错误是 request.body 未定义。它是未定义的,因为您还没有配置 Express 来解析正文。为此,您需要安装模块 body-parser

npm install body-parser

接下来,在你的代码中要求 body-parse

var bodyParser = require('body-parser')

并在初始化 Express 后将其设置为中间件。

var app = express();
app.use(bodyParser.urlencoded( extended: false ));

您的 request.body 现在应该等于表单。

编辑1:

为您的插入查询试试这个

app.post('/insert', function(request, response) 
  var body = request.body;

  var product = 
    name: body.name,
    modelnumber: body.modelnumber,
    series: body.series
  
  client.query('INSERT INTO products SET ?', product, function() 
      response.redirect('/');
  );
);

【讨论】:

谢谢您.. 我尝试使用您的建议。但其他错误来了.. TheypError: cannot call method 'replace' of undefined at Object.SqlString.format。问题是我的查询吗? 看起来你试图在你的 POST 中传递的数据没有通过,所以你正在调用 request.body.name 例如,它可能是未定义的,所以它会抛出一个参数化查询中的错误。在您的函数中,调用 console.log(request.body) 以查看您的数据是否正确传入。 我检查了错误。我把 console.log(request.body) 放在 var body = request.body;我可以检查它是否在控制台窗口上获取数据。但下一行,有错误信息。 你能发布那个console.log的输出吗? 当我把 console.log(request.body);在 var body = request.body 之后;我可以在控制台窗口上看到此错误消息。 --> name: 'Jae-Han', modelnumber: '0104804', series: 'RintSeries' TypeError: Cannot call method 'replace' of undefined 我在网页。【参考方案2】:

在本节中:

app.post('/insert', function(request, response) 
  var body = request.body;

  client.query('INSERT INTO products (name, modelnumber, series) VALUES (?, ?, ?)'[
    body.name, body.modelnumber, body.series
    ], function() 
      response.redirect('/');
  );
);

尝试将request.body 的用法替换为request.params。 当使用表单 + 发布时,节点会将字段解释为请求对象上的参数。

【讨论】:

我是否将 var body = request.body 更改为 var body = request.params?? @Jae-HanPark,是的,继续尝试。

以上是关于如何在 node.js 中使用 token(post) Mysql?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.JS 中将 Json Web Token 拆分为 Header-Payload-Signature

在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证

页面刷新时 JWT Token 已从标题中删除,如何修复?

如何从 Cloud Firestore 数据库中获取 node.js 中的特定字段值?

Node.js JWT,从 token 中获取 user_id

如何解决Vue.js里面noVNC的截图问题——蛋疼的cookies验证和node.js的websocket代理