【问题标题】:error: TS2339 [ERROR]: Property x does not exist ... on Deno compile错误:TS2339 [错误]:属性 x 不存在...在 Deno 编译时
【发布时间】:2020-12-28 07:32:47
【问题描述】:

这是我第一次使用 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

如何解决这个错误?

【问题讨论】:

标签: typescript compiler-errors deno oak


【解决方案1】:

注意:我们可以通过 JSON 请求访问解析数据

const result = ctx.request.body({ type: "json" });
const data = await result.value;

【讨论】:

    【解决方案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;
    

    https://github.com/oakserver/oak/issues/239

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2021-08-10
      • 2019-11-10
      • 2019-01-21
      • 2016-08-13
      • 2017-12-20
      相关资源
      最近更新 更多