Определение настраиваемой конечной точки Express для приложения SAP CAP

Я пытаюсь создать стандартную модель приложения SAP CAP (модель облачной платформы) в SAP Business Application Studio, а также расширить ее дополнительными конечными точками Express помимо тех, которые обслуживаются службами CDS. У меня следующая структура проекта:

Структура проекта

Содержимое package.json:

{
"name": "<app-name>",
"version": "1.0.0",
"description": "A simple CAP project.",
"repository": "<Add your repository here>",
"license": "UNLICENSED",
"private": true,
"dependencies": {
    "@sap/cds": "^3",
    "@sap/cds-dk": "^1.8.5",
    "@sap/hana-client": "^2.4.177",
    "express": "^4",
    "multer": "^1.4.2"
},
"scripts": {
    "start": "npx cds run"
},
"cds": {
    "hana": {
        "deploy-format": "hdbtable"
    },
    "requires": {
        "db": {
            "kind": "sql"
        }
    }
},
"devDependencies": {
    "sqlite3": "^4.2.0"
}}

Server.js:

module.exports = async() => {
const express = require('express')
const cds = require('@sap/cds')

const app = express()
const port = process.env.port || 4004

app.use('/', express.static('app/'))
app.get('/', (req, res) => res.redirect("/app/index.html"))

cds.connect("db")
.serve("all")
.in(app)

return app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))}

Когда я запускаю команду cds watch, приложение запускается правильно, однако, когда я открываю приложение Fiori Elements, появляется следующее сообщение об ошибке:

Сообщение об ошибке в приложении Fiori

Если я удалю файл server.js из папки srv, приложение будет работать отлично. Что могло вызвать сообщение об ошибке? Требуется ли дополнительная настройка?


person Gombos Levente    schedule 30.06.2020    source источник
comment
вы используете HANA или SQLite? Вы сталкиваетесь с этой ошибкой в ​​разработке или в производстве? Контекст Server.js различается в зависимости от среды.   -  person Suncatcher    schedule 01.07.2020
comment
До сих пор я запускал его только в разработке с базой данных sqlite в памяти. В чем разница в server.js между разработкой и производством?   -  person Gombos Levente    schedule 01.07.2020


Ответы (1)


Отвечая на ваш вопрос о разнице, вы используете стандартное объявление источника данных:

"cds": {
  "requires": {
    "db": {
      "kind": "sql"
    }
  }
}

Как мы знаем из справки:

kind:sql заявляет о необходимости базы данных SQL. Он оценивается как sqlite в профиле разработки (активен по умолчанию), в то время как в производстве он равен hana. Таким образом, вам не нужно изменять этот файл, если вы хотите переключаться между двумя базами данных.

Важно понимать эту разницу. Так с какой именно проблемой вы столкнулись?

Со спецификацией "db": {"kind": "sql"} без каких-либо атрибутов среда IDE создала ваш проект в базе данных SQLite в памяти, поэтому он не существует нигде, кроме памяти сервера приложений.

Также вы указали serve("all") в server.json, который формирует все определения модели данных службы, и, скорее всего, некоторые из них кажутся неработающими и / или некоторые другие настройки в server.json. Я предлагаю:

  1. Чтобы явно объявить источник данных и удалить "hana": {"deploy-format": "hdbtable"}

    "cds": {
       "requires": {
           "db": {
             "kind": "sql",
              "credentials": {
               "database": "db/source.db"
           }
         }
       }
    }
    

после cds deploy в папке db будет создана база данных SQLite, чтобы вы могли проверить схему.

  1. Впервые определите свой server.js самым упрощенным способом:

    const app = require('express')()
    cds.serve('all').in(app)
    app.listen()
    

cds.connect("db") то же самое, что cds.connect() в вашем случае, и то же самое, что отсутствие connect() вообще. Да, вы можете свободно опустить команду connect с DS по умолчанию.

  1. Если это server.js не работает, вам следует проверить каждую службу отдельно и найти ошибку.

    cds.serve('./srv/cat-service1.cds')
    cds.serve('./srv/cat-service2.cds')
    cds.serve('./srv/cat-service3.cds')
    ...
    

Если serve("all") работает нормально, добавьте другие server.js директивы одну за другой: app.use, app.get и так далее.

Определенно существует некоторая несогласованность между службами и конфигурацией сервера, но трудно определить точное, не просматривая все определения.

Другие полезные команды для устранения ошибки:

  • эта команда имитирует все ваши зарегистрированные службы из package.json и позволяет изолировать ошибки схемы

    const cds = require("@sap/cds");
    cds.exec("run", "--with-mocks", "--in-memory?");
    
  • эта команда автоматически добавляет таблицу и представления для всех сервисов

    cds deploy --with-mocks
    
  • издевательство над индивидуальной службой

    cds serve --mocked
    
person Suncatcher    schedule 01.07.2020