【发布时间】:2020-02-04 20:48:52
【问题描述】:
我正在尝试使用我的 SQLServer 数据库连接 Node.js 和 express web 服务。
我一直在测试,他们将正确的值返回到数据库,但问题是当我尝试从 Graphql 获取信息并将其转换为 JSON 时
JSON 会正确返回我需要的结构,但所有数据都为空值。
这是数据库配置:
const sql = require('mssql');
const config = {
user: 'user',
password: 'password',
server: 'server',
database: 'db',
options: {
encrypt: true
}
};
这是 Graphql 调用的方法:
let getEmpleado = (id) => {
let datos = sql.connect(config, function(err){
if (err) console.log(err);
let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
let sqlRequest = new sql.Request();
//console.log(sqlQuery);
let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
let datos2;
if (err) console.log(err)
datos = JSON.stringify(empleado.recordset[0]);
sql.close();
console.log(datos);
//return datos2;
});
//return datos1;
});
return datos;
}
结果:
{
"data": {
"empleado": {
"Empleado": null,
"Nombre": null,
"Apellido1": null,
"Apellido2": null
}
}
}
我对此很陌生,我需要一些帮助,因为我已经疯狂地寻找信息。
编辑 1:
调试函数后,我发现它的执行顺序对我来说不符合逻辑。
我再次输入代码,并用数字表示它执行的步骤。
let getEmpleado = (id) => {
1- let datos = sql.connect(config, function(err){
3- if (err) console.log(err);
4- let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
5- let sqlRequest = new sql.Request();
//console.log(sqlQuery);
6- let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
8- let datos2;
9- if (err) console.log(err)
10- datos = JSON.stringify(empleado.recordset[0]);
11- sql.close();
12- console.log(datos);
13- //return datos2;
});
7- //return datos1;
});
2- return datos;
}
编辑 2:
正如 Daniel 所建议的,我检查了 mssql 文档并使用了 Promise 查询示例:Promises Queries Example。
调试后,又出现了一些奇怪的函数执行顺序。
1- const sql = require('mssql')
2- sql.on('error', err => {
// ... error handler
})
3- sql.connect(config).then(pool => {
// Query
6- return pool.request()
.input('input_parameter', sql.Int, id.id)
.query('SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado= @input_parameter')
4- }).then(result => {
7- console.dir(result)
8- return result.recordset[0]
}).catch(err => {
// ... error checks
});
5- console.log('End')
【问题讨论】:
-
和控制台记录好的数据?
-
是的,控制台正确打印数据。当我调试函数时,ir似乎在连接到数据库之前返回值
-
使用异步等待?
-
不,正如我所说,我是 JavaScript 新手,我不知道操作系统到底发生了什么。
-
在答案中添加了一些额外的细节。请检查我标记为欺骗的问题以获得更广泛的解释。
标签: node.js sql-server graphql