Возврат вставленного идентификатора после POST в Express API - PullRequest
0 голосов
/ 03 января 2019

Я работаю с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...