【问题标题】:Azure SQL database is not updating with dataAzure SQL 数据库未更新数据
【发布时间】:2023-04-03 09:50:01
【问题描述】:

我创建了一个 nodejs azure web 应用程序,它运行得非常好, 现在我想将我的帖子数据放到 azure MS SQL DB 中,我为此创建了一个代码,但是 sql db 没有用 POST 数据更新,谁能帮我解决这个问题。

var express = require('express');
var bodyParser = require('body-parser');
var sql = require('mssql');
var port = 8080;
var app = express();`enter code here`
var path = require('path');


//CORS Middleware
app.use(function(req,res,next){
    res.header("Access-Control-Allow-Origin","*");
    res.header("Access-Control-Allow-Methods","GET,HEAD,POST,PUT,OPTIONS");
    res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,contentType,Content-Type,Accept,Authorization");
    next();
});


app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

app.use(bodyParser());
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, 'public')));




//setup database connection
var dbconfig = {
    user:"username",
    password:"password",
    server : "server_name",
    database: "db_name"  
};


// ConnectionPool


//connect to the database 
var executeQuery = function(res,query){
    sql.connect(dbconfig,function(err){
        if(err){
            console.log("there is a database connection error -> "+err);
            res.send(err);
        }
        else{
            // create request object
            var request = new sql.Request();
            // query to the database
            request.query(query,function(err,result){
                if(err){
                    console.log("error while querying database -> "+err);
                    res.send(err);
                }
                else{
                    res.send(result);
                    sql.close();
                }
            });
        }
    });
}



app.get('/', function(req, res){
    res.render('index', {
        title: 'Hello World',
        showTitle:true,
        people: ['John', 'Steve', 'Jose']
    });
});



app.get('/index', function(req, res){
    res.render('index');
});

app.get('/contact', function(req, res){
    res.render('contact');
});




app.post('/my_user', function(req, res){
    //return res.send(req.body);

    console.log(req.body.email + ' and ' + req.body.mobile);

    var parameters = [
            { name: 'email', sqltype: sql.NVarChar, value: req.body.email},
            { name: 'mobile', sqltype: sql.NInt, value: req.body.mobile},
            { name: 'msg', sqltype: sql.NVarChar,  value: req.body.msg},
     ];

    var query = "insert into forMyCV values(@email, @mobile, @msg);";
        executeQuery (res, query, parameters);

    return res.redirect('/');   
});

app.listen(port);
console.log('Server started on port '+port);

谁能帮我解释一下。为什么会这样

【问题讨论】:

  • 没有错误?您确定插入代码正在运行吗?你确定你正在查看的数据库和服务器插入的数据库是同一个数据库吗?
  • @CaiusJard,是的,如果我创建代码只是为了执行 CRUD 操作然后我通过“node sql-crud.js”运行它,它不会显示任何错误,它将执行代码并更新sql 表,当用户点击“提交”按钮时,我想更新我的表。在这段代码中,当用户点击提交按钮时,它不会更新数据库表
  • 所以问题是提交没有调用数据库查询? (这与 SQL、db 等无关……而且问题的标签有误)
  • @CaiusJard,也许吧。不知道,怎么验证?
  • 我以为您已经验证了它,您在上面的评论中基本上是说“如果我直接运行代码它可以工作,但如果我点击提交按钮它不会”

标签: sql node.js azure azure-web-app-service


【解决方案1】:

恐怕我测试过你的代码有两个问题。

  1. 根据下图 Azure 门户上 Azure SQL 数据库的标签Connection strings,连接字符串中也有一个必填参数encrypt=true,如JDBC等。

    因此,使用 mssql 的 Azure SQL 数据库的正确 config 应如下所示。

    const config = {
        user: '<your username>@<your sql server name>',
        password: '<your password>',
        server: '<your sql server name>.database.windows.net', // You can use 'localhost\\instance' to connect to named instance
        database: '<your database name>',
    
        options: {
            encrypt: true // Use this if you're on Windows Azure
        }
    }
    

    不能忽略必需的options: {encrypt: true} 属性。否则会报错。

    there is a database connection error -> ConnectionError: Server requires encryption, set 'encrypt' config option to true.
    (node:665784) UnhandledPromiseRejectionWarning: ReferenceError: res is not defined
    at D:\projects\node\express-demo\mssql-query-demo.js:43:13
    at _poolCreate.then.catch.err (D:\projects\node\express-demo\node_modules\mssql\lib\base.js:287:7)
    at process._tickCallback (internal/process/next_tick.js:68:7)
    (node:665784) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
    (node:665784) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    
  2. executeQuery 函数定义了两个参数resquery,但它在app.post('/my_user') 的回调function(req, res) 中与三个参数executeQuery (res, query, parameters); 一起使用。它不会导致任何错误,只是忽略不匹配的最后一个参数parameters

希望对你有帮助。


更新:重新定义 executeQuery 函数如下。

var executeQuery = function(res,query, parameters){
    sql.connect(dbconfig,function(err){
        if(err){
            console.log("there is a database connection error -> "+err);
            res.send(err);
        }
        else{
            // create request object
            var request = new sql.Request();
            // query to the database
            parameters.map(item => {
                request.input(item.name, item.sqltype, item.value);
            })
            request.query(query,function(err,result){
                if(err){
                    console.log("error while querying database -> "+err);
                    res.send(err);
                }
                else{
                    res.send(result);
                    sql.close();
                }
            });
        }
    });
}

【讨论】:

  • 抱歉回复晚了,如何使用此代码发送帖子参数
  • @RandeerLalangaran 我更新了函数executeQuery的代码。
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多