在a then回调中使用await - 保留关键字'await'

Mat*_*att 3 javascript node.js async-await ecmascript-2017

在node.js中,我有一个数据库事务,我想asyncthen回调中调用一个方法,但是我收到错误消息the keyword 'await' is reserved.

这是异步saveImage功能:

const saveImage = async (parsedLink) => {
  AWS.config.region = config.awsSettings.region;
  AWS.config.accessKeyId = config.awsSettings.accessKeyId;
  AWS.config.secretAccessKey = config.awsSettings.secretAccessKey;
  const bucket = new AWS.S3({
    params: {
      Bucket: config.awsSettings.images_bucket_name,
    },
  });

  const currentDateString = new Date().toISOString().replace(/\:|\./g, '-');
  const bodystream = new Buffer(parsedLink.imgUrl, 'binary');
  const imageUrlDomain = parseDomain(parsedLink.linkUrl).domain;

  const params = {
    Key: `${parsedLink.id}/${imageUrlDomain}_${currentDateString}${parsedLink.imgType}`,
    ContentType: parsedLink.imageMime,
    ContentEncoding: 'base64',
    Body: bodystream,
  };

  const resultPromise = await bucket.upload(params).promise();
  return resultPromise.Location;
};
Run Code Online (Sandbox Code Playgroud)

如果我想使用saveImage函数,我会收到错误消息.

module.exports.addTestObject = async (ctx) => {
  const testObj = ctx.request.body;
  try {
    switch (testObj.type) {
      case interestT.getType.link: {
        const knexTestObject = TestObject.knex();
        transaction(knexTestObject, trx =>
            TestObject.query(trx)
              .insert({
                interestDate: testObj.date,
              })
              .then(newInterest => {
                // save image
                if (parsedLink.saveImg) {
                  parsedLink.imgUrl = await saveImage(testObj);
                }

                newInterest.$relatedQuery('linkInterestsRel', trx).insert({
                  linkHeader: testObj.linkHeader,
                }),
              }
              ),
          )
          .then((linkInterest) => {
            console.log(linkInterest);
          })
          .catch((err) => {
            throw err;
          });
        break;
      }
      default:
        break;
    }
    ctx.response.body = interestObj;
  } catch (err) {
    const statusCode = err.status || 400;
    ctx.throw(statusCode, err.message);
  }
};
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 9

正如尖尖已经指出的那样,你只能awaitasync函数内部使用.所以就这样吧

 .then(newInterest => {
Run Code Online (Sandbox Code Playgroud)

异步:

 .then(async (newInterest) => {
Run Code Online (Sandbox Code Playgroud)

然后回调将返回一个将被展平的承诺.


但是如果你已经使用await了,为什么不这样做

 await TestObject.query(trx)
          .insert({
            interestDate: testObj.date,
          })
Run Code Online (Sandbox Code Playgroud)