【问题标题】:Create a server on Node.js在 Node.js 上创建服务器
【发布时间】:2023-02-06 00:17:21
【问题描述】:

我在Node.js 上创建了一个服务器。我使用 SQL 服务器。我想创建一个通过给定输入查找书籍的 sql 查询。当我写我的查询错误是:

名称:'错误', handlerName: 'onErrorMessage', 号码:207, 状态:1, 班级:16, 消息:“无效的列名‘%@param4%’。”, serverName: 'DESKTOP-PQSULQS\SQLEXPRESS', 过程名称:'', 行号:1

这是一个搜索方法:

async function searchBook(input){
    let result = await sql.query `SELECT * FROM dbo.Books WHERE Title = ${input} OR Kind = ${input} OR Author = ${input} OR Title LIKE "%${input}%"` ;
    return result.recordset;
}

我试图解决这个问题。但我不知道为什么服务器抛出这个异常。有什么建议吗?

【问题讨论】:

  • 查询似乎是错误的。你缺少引号。我建议:(1) 编写并运行针对数据库的查询。 (2) 复制工作查询并使用 javascript 运行它。 (3) 修改查询以接收您的输入参数。 (4) 研究如何防止 SQL 注入,因为该格式会欢迎这些攻击。

标签: javascript sql node.js backend


【解决方案1】:

共享代码示例的主要问题是每个 nvarchar 列值都应包含在单引号 '' 中,如果您使用带有静态值的模板文字。

那么代码将如下所示:

async function searchBook(input){
    let result = await sql.query(`SELECT * FROM dbo.Books WHERE Title = '${input}' OR Kind = '${input}' OR Author = '${input}' OR Title LIKE '%${input}%'`);
    return result.recordset;
}

但是这段代码有sql injection漏洞,所以要防止它。使用参数来克服这个问题。

所以你的代码将如下所示:

async function searchBook(input){

    let result = await sql.query(`SELECT * FROM dbo.Books WHERE Title = @input OR Kind = @input OR Author = @input OR Title LIKE '%' + @input + '%'`, 
        {
            input: sql.NVarChar,
            value: input
        });
    return result.recordset;
}

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多