我想在客户端和服务器端重用同一组验证器,使用Angular 4.4.5和NodeJS 7.10.1(最新的Ubuntu repos)。我相信这是可能的。
我的基本想法是让HTTP端点在NodeJS和Express上运行,它接受来自Angular表单的JSON数据的POST请求,创建与接收数据相同的表单并进行检查。
我的尝试没有成功,我不知道如何使用相同版本的Typescript作为Angular使用以及如何使用表单导入组件。看一些有用的简单例子是理想的。我很快就会分享我的尝试。
答案 0 :(得分:0)
到目前为止,我设法以这种方式实例化Component。
创建cli.ts
以测试Angular组件的独立创建:
import 'reflect-metadata';
import { CuComponent } from './app/cu.component';
console.log(new CuComponent())
使用tsc
中的一些设置运行tsconfig.json
:
tsc -t es5 --lib es2016,dom --experimentalDecorators src/cli.ts
得到输出:
CuComponent {
registration:
FormGroup {
validator: null,
asyncValidator: null,
_onCollectionChange: [Function],
_pristine: true,
_touched: false,
_onDisabledChange: [],
controls: { familyName: [Object], givenName: [Object], phone: [Object] },
_valueChanges:
EventEmitter {
_isScalar: false,
observers: [],
closed: false,
isStopped: false,
hasError: false,
thrownError: null,
__isAsync: false },
_statusChanges:
EventEmitter {
_isScalar: false,
observers: [],
closed: false,
isStopped: false,
hasError: false,
thrownError: null,
__isAsync: false },
_status: 'VALID',
_value: { familyName: null, givenName: null, phone: null },
_errors: null } }
创建了组件。
答案 1 :(得分:0)
经过长时间的搜索,我找到了解决方案。 Angular现在支持带有库的工作区,并使用Node和Express.js在服务器端渲染表单(ssr)。因此,Angular 8+基本上已经具有所需的一切。
我要做的是将所有共享代码都放在一个库中,这样我就可以在前端使用它,也可以在SSR应用程序(验证)上重用它。我认为这不是必需的,但是干净的结构会有所帮助。
要创建结构,我只使用了cli:
ng add @nguniversal/express-engine
。您可以在教程中找到有关如何执行此操作的所有相关信息:
现在,我使用生成的server.ts
并删除了其中的大部分内容(示例处理程序)。
一开始,我在JSON解析方面遇到了一些问题。但是身体分析器可以做到。
// ...
import * as bodyParser from "body-parser";
// ...
export function app() {
const server = express();
server.use(bodyParser.json());
// ...
然后我添加了此处理程序:
server.post('/api/validate', (req, res) => {
// createFormGroup is from my code,
// because I generate the form from TypeScript classes.
// You can just use a FormBuilder in your component
// and export the function so you can use it here.
const fg = createFormGroup();
fg.patchValue(req.body);
res.status(200).send({
"accepted" : "VALID" === fg.status
// You can send additional information, like errors
});
});
调用fg.updateValueAndValidity()
似乎没有必要,因为patchValue
已经做到了所有。
构建和启动服务器的时间。
我现在不知怎么了,构建脚本无法与--prod
一起使用。
但这确实是:
ng build; ng run validation:server:production; npm run serve:ssr
您应该获得:
Node Express server listening on http://localhost:4000
就是这样。真的很容易。
我使用curl进行测试:
curl.exe --data "@data.json" -H "Content-Type: application/json" -X POST http://localhost:4000/api/validate
我不知道该如何调试,但是console.log
可以正常工作。而且,要测试您在该服务器上使用的代码,无论如何都应该只使用单元测试(茉莉花)。因此,即使启动速度很慢,我也很高兴现在可以在服务器上验证代码。
可能有必要递归比较req.body
和fg.value
是否相等,以确保验证后它们仍然是相同的数据。