typescript - 错误:TS2339 [错误]:属性 x 不存在...在 Deno 编译
问题描述
这是我第一次使用 Oak 和 Deno。我是从https://www.robinwieruch.de/deno-oak-rest-api和文档中学到的。我想使用这个脚本(server.ts)来使用 REST-API deno。
import { v4 } from 'https://deno.land/std/uuid/mod.ts';
import {
Application,
Router,
helpers,
} from 'https://deno.land/x/oak/mod.ts';
interface User {
id: string;
username: string;
}
const users = new Map<string, User>();
users.set('1', {
id: '1',
username: 'Robin Wieruch',
});
users.set('2', {
id: '2',
username: 'Dave Davids',
});
interface Message {
id: string;
text: string;
userId: string;
}
const messages = new Map<string, Message>();
messages.set('1', {
id: '1',
text: 'Hello World',
userId: '1',
});
messages.set('2', {
id: '2',
text: 'By World',
userId: '2',
});
const port = 8000;
const app = new Application();
const router = new Router();
router.get('/session', (ctx) => {
ctx.response.body = users.get(ctx.state.me.id);
});
router.get('/users', (ctx) => {
ctx.response.body = Array.from(users.values());
});
router.get('/users/:userId', (ctx) => {
const { userId } = helpers.getQuery(ctx, { mergeParams: true });
ctx.response.body = users.get(userId);
});
router.get('/messages', (ctx) => {
ctx.response.body = Array.from(messages.values());
});
router.get('/messages/:messageId', (ctx) => {
const { messageId } = helpers.getQuery(ctx, { mergeParams: true });
ctx.response.body = messages.get(messageId);
});
router.post('/messages', async (ctx) => {
const id = v4.generate();
const {
value: { text },
} = await ctx.request.body();
messages.set(id, {
id,
text,
userId: ctx.state.me.id,
});
ctx.response.body = messages.get(id);
});
router.delete('/messages/:messageId', async (ctx) => {
const { messageId } = helpers.getQuery(ctx, { mergeParams: true });
const isDeleted = messages.delete(messageId);
ctx.response.body = isDeleted;
});
app.use(async (ctx, next) => {
ctx.state = { me: users.get('1') };
await next();
});
app.use(router.allowedMethods());
app.use(router.routes());
app.addEventListener('listen', () => {
console.log(`Listening on: localhost:${port}`);
});
await app.listen({ port });
运行它后,deno run --allow-net --allow-read server.ts
我收到以下错误:
$ deno run --allow-net --allow-read server.ts
Check file:///home/astrid/git/javascript/deno/deno-oak-rest-api/server.ts
error: TS2339 [ERROR]: Property 'text' does not exist on type 'Promise<any> | Promise<URLSearchParams> | FormDataReader | Promise<string> | Promise<Uint8Array> | undefined'.
value: { text },
~~~~
at file:///home/astrid/git/javascript/deno/deno-oak-rest-api/server.ts:77:14
这是我的版本
$ deno --version
deno 1.3.3
v8 8.6.334
typescript 4.0.2
如何解决这个错误?
解决方案
已在 #201 左右更改
ctx.request.body()
不再是异步的,所以你可以放弃await
- 现在接受身体类型的参数
value
现在是一个承诺,所以需要等待(这是 ts 问题所强调的)不确定您以前使用的是哪种体型,但这是最新版本中的一些用法
// for JSON: const { value } = ctx.request.body({ type: "json" }); const { text } = await value; // for FormData: const { value } = ctx.request.body({ type: "form-data" }); const formData = await value.read(); const { text } = formData.fields;
推荐阅读
- amazon-web-services - 获取范围内的查询结果 Redshift
- java - 如何使用 Jackson 修复带有 Jersey 客户端的 MessageBodyProviderNotFoundException?
- android - 更新到 Android Studio 3.5 后,2019 年构建项目需要很长时间
- neural-network - 当我们使用激活函数时,我们如何知道一个神经元被激活了
- scala - 如何按特定类的数据框分组
- reactjs - 状态已正确更新和记录,但 HTML 中的值仍然错误
- laravel - Laravel 分页从 ?page=1 更改为 /page/1
- amazon-web-services - 使用安全组中的入站规则为 ec2 实例上的本地计算机添加 IP 白名单
- excel - 如何在不使用代号作为限定符的情况下访问另一个(引用的)VBA 项目的公共变量
- arrays - 无法从数组中获取字符串值