【问题标题】:Bind problem in SQL query in Node, Express, Mysql2 appNode、Express、Mysql2 应用程序中的 SQL 查询绑定问题
【发布时间】:2021-08-30 13:01:28
【问题描述】:

我一直在关注tutorial 在 Node 中设置 REST API,将 Express 用于访问现有 MariaDB 数据库的应用程序。我的版本只需要读取数据,并且我的数据库与 Node 应用程序位于同一位置(同一主机)。

对于这个入门级示例,我的目标是仅使用静态 SQL 访问数据,因此我可以看到它在网页中由 JSON pritifier 呈现。

[接下来,我想在表格中呈现数据(EJS?)。稍后,当我可以让它工作时,我将添加表单控件(React?),让用户为 SQL 查询指定开始和结束日期范围。最后,我的目标是将数据呈现为折线图(D3js)。]

本教程成功运行 Web 服务器(它在基本 URL 上返回“OK”),但是当我转到 URL/solarData 时,它会尝试使用异步函数从数据库中获取多行,它会响应:

Bind parameters must not contain undefined. To pass SQL NULL specify JS null TypeError: Bind parameters must not contain undefined. To pass SQL NULL specify JS null
    at /SunnyData/solarViz/node_modules/mysql2/lib/connection.js:628:17
    at Array.forEach (<anonymous>)
    at Connection.execute (/SunnyData/solarViz/node_modules/mysql2/lib/connection.js:620:22)
    at /SunnyData/solarViz/node_modules/mysql2/promise.js:120:11
    at new Promise (<anonymous>)
    at PromiseConnection.execute (/SunnyData/solarViz/node_modules/mysql2/promise.js:117:12)
    at Object.query (/SunnyData/solarViz/services/db.js:6:40)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async Object.getMultiple (/SunnyData/solarViz/services/solarData.js:7:16)
    at async /SunnyData/solarViz/routes/solarData.js:8:14
app.js:61

./app.js

const express = require('express');
const app = express();
const port = process.env.PORT || 3800;
const solarDataRouter = require('./routes/solarData');

app.use(express.json());
app.use(
  express.urlencoded({
    extended: true,
  })
);

app.get('/', (req, res) => {
  res.json({'message': 'ok'});
})

app.use('/solarData', solarDataRouter);

/* Error handler middleware */
app.use((err, req, res, next) => {
  const statusCode = err.statusCode || 500;
  console.error(err.message, err.stack);
  res.status(statusCode).json({'message': err.message});


  return;
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
});

./routes/solarData.js

const express = require('express');
const router = express.Router();
const solarData = require('../services/solarData');

/* GET solar data. */
router.get('/', async function(req, res, next) {
  try {
    res.json(await solarData.getMultiple(req.query.page));
  } catch (err) {
    console.error(`Error while getting solar data `, err.message);
    next(err);
  }
});
module.exports = router;

./config.js

const env = process.env;

const config = {
  db: { 
    host: env.SUNNY_HOST,
    user: env.SUNNY_USER,
    password: env.SUNNY_PW,
    database: env.SUNNY_DB,
  },
  listPerPage: env.LIST_PER_PAGE,
};

module.exports = config;

./services/solarData.js

const db = require('./db');
const helper = require('../helper');
const config = require('../config');

async function getMultiple(page = 1){
  const offset = helper.getOffset(page, config.listPerPage);
  const rows = await db.query(
    `SELECT * FROM DTP LIMIT ?,?`, [offset, config.listPerPage]
  );
  const data = helper.emptyOrRows(rows);
  const meta = {page};

  return {
    data,
    meta
  }
}
module.exports.getMultiple = getMultiple;

./services/db.js

const mysql = require('mysql2/promise');
const config = require('../config');

async function query(sql, params) {
  const connection = await mysql.createConnection(config.db);
  const [results, ] = await connection.execute(sql, params);

  return results;
}

module.exports = {
  query
}

我省略了 ./helper.js

在我将网页定向到 /solarData 之前,一切都运行良好。那时我得到了前面提到的调试控制台(vscode)

搜索似乎指向 mysql2 的一个缺点/错误,但不是一个实用的解决方案 如果您回复,请描述“绑定”机制,因为我不确定发生了什么。

希望我已经输入了足够的信息。请询问我是否需要添加其他任何内容。

【问题讨论】:

    标签: javascript node.js express node-mysql2


    【解决方案1】:

    错误提示

    绑定参数不能包含未定义。

    表示在文件./services/solarData.js就行了

    const rows = await db.query(
        `SELECT * FROM DTP LIMIT ?,?`, [offset, config.listPerPage]
      );
    

    2 个变量中的一些未定义,您需要检查 offsetconfig.listPerPage 才能定义。

    随便用

    console.log('offset: ' + offset)
    console.log('listPerPage: ' + config.listPerPage)
    

    你会发现在你的情况下什么是未定义的

    【讨论】:

    • 谢谢德米特里。看来你是对的。 LIST_PER_PAGE 未定义,因为用于获取环境变量的config.js 未定义,或者,如果是,则./services/solarData.js 未正确表达它们。 config.js 中的所有环境变量都会出现同样的问题。它们存在于环境中 - 通过 ssh 检查,例如echo $SUNNY_DB ---> SunnyData2
    • 将 listPerPage 从 listPerPage: env.LIST_PER_PAGE 替换为 listPerPage: env.LIST_PER_PAGE || 10
    • 或者在 ./services/solarData.js 中只写 10 而不是 config.listPerPage
    • module.exports = config; from config.js 然后我const config = require('../config'); from ./services/solarData.js 在SolarData.js中,如果我想使用来自config的环境变量,是吗,例如,config.host(使用来自config 模块的分配变量名?
    • 我刚刚在我的所有配置中添加了|| 指令,其中包含用于访问我的数据库的明文值,它确实让我可以访问数据但它很容易受到攻击,所以我真的热衷于让 process.env 方法工作 - 我认为这取决于我如何提取 ./services/solarData.js 中的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多