Node.js Nodejs、GraphQl和SQLServer返回空值

Node.js Nodejs、GraphQl和SQLServer返回空值,node.js,sql-server,graphql,Node.js,Sql Server,Graphql,我正在尝试将Node.js和expressweb服务与SQLServer数据库连接起来 我一直在测试,它们返回正确的值​​但问题是当我试图从Graphql获取信息并将其转换为JSON时 JSON返回我正确需要的结构,但包含所有空值数据 这是数据库配置: const sql = require('mssql'); const config = { user: 'user', password: 'password', server: 'server', database: 'db', optio

我正在尝试将Node.js和expressweb服务与SQLServer数据库连接起来

我一直在测试,它们返回正确的值​​但问题是当我试图从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 sugested所说,我检查了mssql文档,并使用了promise查询示例:

调试后,再次执行一些奇怪的命令

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')

无需使用
stringify
。您的解析器应该返回一个普通对象,其属性与返回类型的字段匹配。换句话说,返回
empleado.recordset[0]
就足够了


每个解析器都会将其父字段解析为的值作为第一个参数接收。如果不提供客户解析程序,GraphQL.js中的默认行为是尝试返回与字段同名的父值属性。换句话说,
Nombre
字段的默认解析行为是返回
parent.Nombre
。如果父字段的解析器返回
{Nombre:'Fernando'}
,则
Nombre
字段将解析为
“Fernando”
。如果父字段的解析程序返回字符串,
Nombre
将解析为
null
,因为字符串没有名为
Nombre
的属性,因此不需要使用
stringify
。您的解析器应该返回一个普通对象,其属性与返回类型的字段匹配。换句话说,返回
empleado.recordset[0]
就足够了


每个解析器都会将其父字段解析为的值作为第一个参数接收。如果不提供客户解析程序,GraphQL.js中的默认行为是尝试返回与字段同名的父值属性。换句话说,
Nombre
字段的默认解析行为是返回
parent.Nombre
。如果父字段的解析器返回
{Nombre:'Fernando'}
,则
Nombre
字段将解析为
“Fernando”
。如果父字段的解析程序返回字符串,
Nombre
将解析为
null
,因为字符串没有名为
Nombre

的属性,并且控制台记录了良好的数据?是的,控制台正确打印数据。当我调试函数时,ir似乎会在连接到数据库之前返回值Use async await?不,正如我所说,我是JavaScript新手,不知道操作系统到底发生了什么。在答案中添加了一些额外的细节。请检查我标记为重复的问题,以获得更广泛的解释。控制台记录良好的数据?是的,控制台正确打印数据。当我调试函数时,ir似乎会在连接到数据库之前返回值Use async await?不,正如我所说,我是JavaScript新手,不知道操作系统到底发生了什么。在答案中添加了一些额外的细节。请检查我标记为重复的问题,以获得更详细的解释。正如您所建议的,我已更改了代码,并只在报税单中输入employee.recordset[0],但我仍然存在相同的问题。我已经添加了有关函数执行顺序的其他信息。@Fernando在使用GraphQL时,还需要避免使用回调。您可以将承诺与
mssql
库一起使用——检查它们的文档。另请参见,我已通过添加代码和带有承诺的代码的执行顺序来编辑问题。正如您所建议的,我已更改了代码,并只在return only employee.recordset[0]中输入,但我仍然存在相同的问题。我已经添加了有关函数执行顺序的其他信息。@Fernando在使用GraphQL时,还需要避免使用回调。您可以将承诺与
mssql
库一起使用——检查它们的文档。还可以看到,我通过添加代码和带有承诺的代码执行顺序来编辑问题。