我遇到了一个 SSR 问题,不知何故 Angular 文档和新的 Angular 开发文档都没有提供有关它的信息,或者至少我没有找到任何信息。
我想知道如何将数据从浏览器传输到服务器,因为使用 TransferState API 反向传输数据非常简单。对我来说,这也有点奇怪,没有与其他方式类似的 TransferState,或者 TransferState API 不是双向的。
我尝试在
server.ts
函数文件的 app()
中添加一条后置路由,如下所示:
server.post('/test', (req, res, next) => {
console.log('The Body of the Request: ', req.body)
res.send("Got the request!")
})
但是每当我尝试在浏览器中调用这样的路线时:
readonly #http = inject(HttpClient)
testEndpoint() {
this.#http.post('http://localhost:4200/test', {hello: 'world'}).subscribe(console.log)
}
但是当我尝试在浏览器中这样调用它时:
if (isPlatformBrowser(this.platformID)) {
this.#service.testEndpoint()
}
它返回“NG04002”,这基本上意味着 RouterModule/Router 找不到该路由。 这对我来说没有意义,但也许我错过了一些明显的东西。
另请注意,我提供的代码只是伪代码,可能不是有效的 javascript/typescript 代码,因为我目前无法访问我的真实代码库。如果这还不足以查明错误,请告诉我,只要问题得到解决,我就会添加所需的所有内容。
SSR 旨在
prerendering
服务器上的内容并在客户端上进行水化(或不水化),它不是用于编写 node.js
代码的 Web 服务器。
因为无论你选择哪条路线,Angular 都会搜索该路线对应的 Angular 路线!
而是在端口
node.js
或除 4000
(默认角度服务器端口)之外的任何端口运行单独的 4200
服务器,并通过此单独的服务器进行 api 调用!
我找到了解决问题的方法。 Angular 17 在运行 ngserve 时显然会忽略 server.ts 文件,并且仅在使用 ng build 进行构建并随后执行 .mjs 文件时才考虑。这是因为 Angular 使用内部开发服务器,而不是您在 server.ts 中提供的服务器。
https://github.com/angular/angular-cli/issues/26472 https://github.com/angular/angular-cli/issues/26323
这些 github 问题也是由像我这样的困惑的人提出的,但从我得到的情况来看,这是定义的行为。 据我所知,官方 Angular 文档中没有记录这一点。