2

我正在尝试在 SAP Business Application Studio 中创建一个标准的 SAP CAP(云平台应用程序模型),并且除了 CDS 服务提供的端点之外,还使用其他 Express 端点对其进行扩展。我有以下项目结构:

项目结构

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"
}}

服务器.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 应用程序中的错误消息

如果我从 srv 文件夹中删除 server.js 文件,则该应用程序运行良好。什么可能导致错误消息?是否需要任何额外的配置?

4

1 回答 1

0

回答有关差异的问题,您使用标准数据源声明:

"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.useapp.get依此类推。

服务和服务器配置之间肯定存在一些不一致,但如果不查看所有定义,就很难确定确切的配置。

其他有助于调试错误的命令:

  • 此命令模拟您所有已注册的服务,package.json并允许隔离架构错误

    const cds = require("@sap/cds");
    cds.exec("run", "--with-mocks", "--in-memory?");
    
  • 此命令自动为所有服务添加表和视图

    cds deploy --with-mocks
    
  • 嘲笑个人服务

    cds serve --mocked
    
于 2020-07-01T11:13:28.857 回答