Я работаю с Express и SQL Server для создания API-интерфейсов mi. Сейчас мне нужно вернуть вставленный идентификатор в ответ API после POST.
Это мой код:
const express = require('express');
const bodyParser = require('body-parser');
const sql = require('mssql');
const app = express();
app.use(bodyParser.json());
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, contentType,Content-Type, Accept, Authorization");
next();
});
const dbConfig = {
user: "usr",
password: "psswd",
server: "server",
database: "daDB"
};
const executeQuery = function (res, query, parameters) {
sql.connect(dbConfig, function (err) {
if (err) {
console.log(`You have an error: ${err}`);
res.send(err);
sql.close();
}
else {
var request = new sql.Request();
if (parameters && parameters.length > 0) {
parameters.forEach(function (p) {
request.input(p.name, p.sqltype, p.value);
});
}
request.query(query, function (err, result) {
if (err) {
console.log(`You have an error: ${err}`);
res.send(err);
sql.close();
}
else {
res.send(result.recordset);
sql.close();
}
});
}
});
}
app.get("/api/InvoiceRequestApi", function (req, res) {
var query = "SELECT * FROM [InvoiceRequest];
executeQuery(res, query);
});
app.post("/api/InvoiceRequestApi", function (req, res) {
const parameters = [
{ name: 'OrderId', sqltype: sql.VarChar, value: req.body.OrderId },
{ name: 'Mail', sqltype: sql.VarChar, value: req.body.Mail },
{ name: 'Name', sqltype: sql.VarChar, value: req.body.Name },
{ name: 'RFC', sqltype: sql.VarChar, value: req.body.RFC },
{ name: 'Adress', sqltype: sql.VarChar, value: req.body.Adress },
{ name: 'NoExt', sqltype: sql.VarChar, value: req.body.NoExt },
{ name: 'NoInt', sqltype: sql.VarChar, value: req.body.NoInt },
{ name: 'District', sqltype: sql.VarChar, value: req.body.District },
{ name: 'CP', sqltype: sql.VarChar, value: req.body.CP },
{ name: 'Municipality', sqltype: sql.VarChar, value: req.body.Municipality },
{ name: 'State', sqltype: sql.VarChar, value: req.body.State },
{ name: 'CreationDate', sqltype: sql.VarChar, value: req.body.CreationDate },
{ name: 'GeneratedInvoice', sqltype: sql.Bit, value: req.body.GeneratedInvoice },
{ name: 'InvoiceFile', sqltype: sql.VarChar, value: req.body.InvoiceFile },
{ name: 'FileXml', sqltype: sql.VarChar, value: req.body.FileXml },
{ name: 'StatusId', sqltype: sql.Int, value: req.body.StatusId }
];
var query = "INSERT INTO [InvoiceRequest] VALUES(@OrderId, @Mail, @Name, @RFC, @Adress, @NoExt, @NoInt, @District, @CP, @Municipality, @State, @CreationDate, @GeneratedInvoice, @InvoiceFile, @FileXml, @StatusId) SELECT SCOPE_IDENTITY() AS Id";
executeQuery(res, query, parameters);
});
const PORT = process.env.PORT || 8080
app.listen(PORT, () => {
console.log(`App running on port: ${PORT}`)
});
Я нашел несколько постов по stackoverflow, где предлагают использовать SELECT SCOPE_IDENTITY() AS Id
после вставки, и другие, где OUTPUT INSERTED.Id
перед вставкой также можно использовать, но с обоими ответами у меня есть две ошибки. Если я отправлю свои данные так:
function sendMyData(){
var invoiceData = {
OrderId: $scope.theOrder,
Mail: $scope.getMail,
Name: $scope.getName,
RFC: $scope.getTax,
Adress: $scope.getStreet,
NoExt: $scope.getExternal,
NoInt: $scope.getInternal,
District: $scope.getDistrict,
CP: $scope.getPostalCode,
Municipality: $scope.getMunicipality,
State: $scope.getState,
CreationDate: '2019-01-02',
GeneratedInvoice: null,
InvoiceFile: null,
FileXml: null,
StatusId: 1
};
//console.log(invoiceData);
saveRequest.save(invoiceData).$promise
.then(function(response){
console.log(response);
});
}
Ошибка говорит о том, что:
Ошибка в конфигурации ресурса для действия save
. Ожидаемый ответ содержит объект, но получил массив
Итак, если я сделаю изменение следующим образом:
function sendMyData(){
var invoiceData = {
OrderId: $scope.theOrder,
Mail: $scope.getMail,
Name: $scope.getName,
RFC: $scope.getTax,
Adress: $scope.getStreet,
NoExt: $scope.getExternal,
NoInt: $scope.getInternal,
District: $scope.getDistrict,
CP: $scope.getPostalCode,
Municipality: $scope.getMunicipality,
State: $scope.getState,
CreationDate: '2019-01-02',
GeneratedInvoice: null,
InvoiceFile: null,
FileXml: null,
StatusId: 1
};
//console.log(invoiceData);
saveRequest.save([invoiceData]).$promise
.then(function(response){
console.log(response);
});
}
Ошибка говорит о том, что:
"Невозможно вставить значение NULL в столбец 'OrderId', таблица 'daDB.dbo.InvoiceRequest'; столбец не допускает нулевые значения. INSERT завершается ошибкой."
что я делаю не так? Кто-нибудь может мне помочь, пожалуйста?
UPDATE
Используя метод POST без двух примеров, которые я нашел, процесс прошел успешно; другими словами, POST работает.
Также еще один маленький вопрос:
Могу ли я использовать запрос var getdate()
для установки моей CreationDate?
Я использую Javascript, Node, Express и SQL Server.