1

下面的代码属于index.js文件。

当我根据代码转到链接“localhost:300/admins/”时,它应该与 SQL Server 连接并在控制台上取回结果。

我的 Microsoft SQL Server Management Studio 2012 运行良好,并且从 Visual Studio 可以顺利运行。

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const path = require('path');
const hbs = require('hbs');
const sql = require('mssql');
const sqlConfig = {
  user: 'xxx',
  password: 'xxxx',
  database: 'xxxxx',
  server: '127.0.0.1',
  port: xxxx,
  pool: {
    max: 10,
    min: 0,
    idleTimeoutMillis: 30000,
  },
};

// static file's path set up
app.use(express.static('public'));
app.use('/css', express.static(__dirname + '/public'));
app.use('/images', express.static(__dirname + '/public'));
app.use('/js', express.static(__dirname + '/public'));

const pagespath = path.join(__dirname, './templates/views');
const partialspath = path.join(__dirname, './templates/partials');

// Set Views and view engine

app.set('view engine', 'hbs');
app.set('views', pagespath);
hbs.registerPartials(partialspath);

app.get('/', (req, res) => {
  res.render('home', { title: 'Home' });
});
app.get('/admins', function (req, res) {
  var result;
  async () => {
    try {
      const pool = await sql.ConnectionPool(config);
      const result = await pool.query`select name from tbl_info_p_admin`;
      res._write(result);
      console.log(result);
    } catch (err) {
      console.log(err);
    }
    await sql.close();
  };
  res.render('./admin/masters', { title: 'ADMIN' });
});

app.listen(process.env.PORT || 3000, function (err) {
  if (err) {
    console.log(err);
  } else {
    console.log('Server Started At Port 3000');
  }
});
4

2 回答 2

0
  1. MSSQL 服务器连接配置。

    const config = {
      user: 'XX', // sql user
      password: 'xxxxxx', //sql user password
      server: '127.0.0.1', // if it does not work try- localhost
      database: 'xxxxxx',
      options: {
        trustServerCertificate: true,
        useColumnNames: true,        
        rowCollectionOnDone: true,
        trustedconnection: true,
        enableArithAbort: false,
        instancename: 'MSSQLSERVER',  // SQL Server instance name
        cryptoCredentialsDetails: {
           minVersion: 'TLSv1'
        },
      },
      port: 1433
    }
    module.exports = config;
    
于 2021-11-15T07:28:30.840 回答
0

我可以看到您的代码中至少有两个问题

  1. 正如@AlwaysLearning 已经提到的,您的 sql 配置对象定义为,sqlConfig但您使用sql.ConnectionPool(config)
  2. 调用端点时,您的代码基本上什么都不做/admins(除非res.render("./admin/masters", { title: "ADMIN"});您正在定义一个匿名函数,async ()=>{...}但实际上从未执行过。要执行匿名函数,您可以使用 IIFE。在这种情况下,这不是一个好主意,因为会出现有关异步调用的问题。我怀疑您这样做是为了可以使用 async/await。为此,您不会将相关代码包装在匿名异步函数中,而是使整个回调函数异步。

const express = require('express');
const app = express();
const bodyParser = require("body-parser");
const path = require('path');
const hbs = require('hbs');
const sql = require('mssql')
const sqlConfig = {
  user: "xxx",
  password:"xxxx",
  database: "xxxxx",
  server: '127.0.0.1',
  port:xxxx,
  pool: {
    max: 10,
    min: 0,
    idleTimeoutMillis: 30000
  }
}

// static file's path set up
app.use(express.static('public'));
app.use('/css', express.static(__dirname + '/public'));
app.use('/images', express.static(__dirname + '/public'));
app.use('/js', express.static(__dirname + '/public'));

const pagespath = path.join(__dirname, './templates/views');
const partialspath = path.join(__dirname, './templates/partials');

// Set Views and view engine

app.set('view engine', 'hbs');
app.set('views', pagespath);
hbs.registerPartials(partialspath);

app.get("/", (req, res) => {
  res.render("home", { title: "Home" });
});

app.get('/admins', async function(req, res) {
  try {
    const pool = await sql.ConnectionPool(sqlConfig);
    const result = await pool.query`select name from tbl_info_p_admin`;
    res._write(result);
    console.log(result)
  } catch (err) {
    console.log(err);
  }
  await sql.close();
  res.render("./admin/masters", { title: "ADMIN"}); 
});

app.listen(process.env.PORT || 3000, function (err) {
  if (err) {
    console.log(err);
  } else {
    console.log("Server Started At Port 3000");
  }
});

我自己无法对此进行测试,但我希望它有所帮助。

小补充:

  • 您可能想在 finally 子句中关闭 sql 连接
  • 最好不要在每次请求后关闭连接。但我不确定,因为我对 mssql 不太熟悉。
于 2021-11-08T13:20:36.747 回答