node-mssql не будет выполнять хранимую процедуру, давая unhandlePromiseRejectionWarning
Ниже приведен вывод из моего файла server.js.
Я распечатываю параметры строки запроса, которые я передаю в хранимую процедуру.
ID : 10################_
Email : test@mail.com
Name : testname
FamilyName : testtesttest
Ниже это ошибка, которую я получаю:
(узел:8084) UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 1): TypeError: Невозможно прочитать свойство 'тип' из неопределенного
(узел:8084) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.
Ниже мой вызов хранимой процедуры. Я продолжаю получать вышеуказанную ошибку, и хранимая процедура не выполняется. Я посмотрел на следующую ссылку, которая, похоже, имеет ту же проблему, но я все еще получаю ту же ошибку.
Это моя первая попытка вызвать хранимую процедуру с помощью этого модуля узла. Так что любая помощь приветствуется.
app.get('/addRegistration', function(req,res){
try
{
const pool5 = new sql2.ConnectionPool(config, err =>
{
// Stored Procedure
pool5.request()
.input('FBID', sql2.varchar, 250, req.query.id)
.input('FBEmail', sql2.varchar, 250, req.query.email)
.input('FBName', sql2.varchar, 250, req.query.memberName)
.input('FamilyName', sql2.varchar, 250, req.query.familyName)
.execute('sp_registerUser', (err, result) =>
{
console.log("Success");
}).catch(function(err) {
console.log(err);
});
})
pool5.on('error', err => {
console.log("Error");
})
} catch (err) {
// ... error checks
console.log("addRegistration: " + err)
}
});
3 ответа
Я нашел проблему. Это был мой оригинальный код.
.input('FBID', sql2.varchar, 250, req.query.id)
.input('FBEmail', sql2.varchar, 250, req.query.email)
.input('FBName', sql2.varchar, 250, req.query.memberName)
.input('FamilyName', sql2.varchar, 250, req.query.familyName)
Необходимо изменить на:
.input('FBID', sql2.VarChar(250), req.query.id)
.input('FBEmail', sql2.VarChar(250), req.query.email)
.input('FBName', sql2.VarChar(250), req.query.memberName)
.input('FamilyName', sql2.VarChar(250), req.query.familyName)
В конечном счете размер был частью параметра значения. Все было неправильно. Как только я сделал это правильно, хранимая процедура была выполнена, как и ожидалось.
Извиняюсь, если это звучит беспечно, но я не могу видеть в вашем коде, где вы определили запрос - поэтому мой лучший ответ будет то, что он не определен, так как ошибка говорит...
Сначала создайте файл подключения для сервера sql.
import mysql from 'mysql';
import config from 'config-yml';
import logger from '../logger';
/**
* @description Creating pool to have simultanious connection to SQL.
*/
const pool = mysql.createPool({
connectionLimit: config.db.max_limit,
host: config.db.host,
user: config.db.user,
port: config.db.port,
password: config.db.password,
database: config.db.name,
debug: process.env.DB_DEBUG || false, // Set to true if you want to debug the database.
});
/**
* @description Creates the database connection.
*/
pool.getConnection((err, connection) => {
if (err) {
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
logger.error('Database connection was closed.');
}
if (err.code === 'ER_CON_COUNT_ERROR') {
logger.error('Database has too many connections.');
}
if (err.code === 'ECONNREFUSED') {
logger.error('Database connection was refused.');
}
}
if (connection) connection.release();
});
module.exports = pool;
Затем создайте функцию экспорта для выполнения кода запроса следующим образом.
import pool from '../index';
const execQuery = async (query, fn) => {
pool.query(query, async (err, result, fields) => { // eslint-disable-line
try {
console.log(result[0][0]);
fn(result[0][0]);
return result;
} catch (err) {
return err;
}
});
};
export default execQuery;
После этого напишите процедуру в Workbench и вызовите функцию процедуры sql.
call SO_CALLED_PROCEDURE(PASS_ARGUMENT)
;
это будет работать.