(!) Issue cannot be reproduced locally.
Azure Function Version ~4
Node Version 14.18.1

创建一个简单的HTTP触发Azure函数并只设置两个简单属性,我们得到以下代码:

module.exports = async function (context, req) {

    req.auth = {authField: 'some value'}
    req.user = {userField: 'some value'}
    context.log(`${JSON.stringify(req,null,2)}`);

    context.res = {
        body: 'responseMessage'
    };
}

记录器打印以下对象:

{
  "method": "POST",
  "url": "xxx",
  "originalUrl": "xxx",
  "headers": {
    /// ...
  },
  "query": {},
  "params": {},
  "body": { "name": "Azure" },
  "rawBody": "{\"name\":\"Azure\"}",
  "auth": { "authField": "some value" }
}

正如你所看到的,只有auth被设置,而不是user.

当我使用Azure Function~3进行测试时,输出如下所示:

{
  "method": "POST",
  "url": "xxx",
  "originalUrl": "xxx",
  "headers": {
    // ...
  },
  "query": {},
  "params": {},
  "body": { "name": "Azure" },
  "rawBody": "{\"name\":\"Azure\"}",
  "auth": { "authField": "some value" },
  "user": { "userField": "some value" }
}

正如你所见,这个字段已经设置好了.

字段user由我们通过express-jwt(v6.1.0)使用,当没有为requestProperty提供值时,它是using.

我还不能复制它,但在从Typescript项目传输出来的过程中,我们得到了以下运行时错误:

FailureException: Cannot set property user of [object Object] which has only a getterStack: TypeError: Cannot set property user of [object Object] which has only a getterat Object.run

这一问题始于2022年4月26日.

问题:

  • 原因是什么?
  • 是否可以快速回滚到运行正常的Azure功能自定义版本?

推荐答案

我在this PR中找到了罪魁祸首,它是为Azure Function runtime v4添加的.2.0.

The user field was added with only a getter.
We took the code and made the minimal example:

class Request {
    #cachedUser?: string | null;
    constructor() {
    }
    get user(): string | null {
        if (this.#cachedUser === undefined) {
            this.#cachedUser = "some value";
        }
        return this.#cachedUser;
    }
}

并得到了以下透明版本:

var __classPrivateFieldGet =
    (this && this.__classPrivateFieldGet) ||
    function (receiver, state, kind, f) {
        if (kind === 'a' && !f) throw new TypeError('Private accessor was defined without a getter')
        if (typeof state === 'function' ? receiver !== state || !f : !state.has(receiver))
            throw new TypeError('Cannot read private member from an object whose class did not declare it')
        return kind === 'm' ? f : kind === 'a' ? f.call(receiver) : f ? f.value : state.get(receiver)
    }
var __classPrivateFieldSet =
    (this && this.__classPrivateFieldSet) ||
    function (receiver, state, value, kind, f) {
        if (kind === 'm') throw new TypeError('Private method is not writable')
        if (kind === 'a' && !f) throw new TypeError('Private accessor was defined without a setter')
        if (typeof state === 'function' ? receiver !== state || !f : !state.has(receiver))
            throw new TypeError('Cannot write private member to an object whose class did not declare it')
        return kind === 'a' ? f.call(receiver, value) : f ? (f.value = value) : state.set(receiver, value), value
    }
var _Request_cachedUser
class Request {
    constructor() {
        _Request_cachedUser.set(this, void 0)
    }
    get user() {
        if (__classPrivateFieldGet(this, _Request_cachedUser, 'f') === undefined) {
            __classPrivateFieldSet(this, _Request_cachedUser, 'some value', 'f')
        }
        return __classPrivateFieldGet(this, _Request_cachedUser, 'f')
    }
}
_Request_cachedUser = new WeakMap()

// this section is added for testing
const request = new Request()
request.user = 'new value'
console.log(JSON.stringify(request.user))

因此,它总是返回初始值,在我们的示例中是"some value",但在原始代码中只是undefined,不允许设置它.

Node.js相关问答推荐

如何修复PayPal Node.js Webhook中Webhook签名验证失败?''

在Nest.Js中,如何发送带有表单数据的正文请求并应用正文请求验证.附加的文件是可选的

如何使用Nextjs路由从下一步/导航在新选项卡中通过";router.ush";打开链接

类扩展值[object object]不是构造函数或null

如果我加入另一个公会且我的​​机器人已在其中,欢迎消息发送错误

为什么 Cors 在 NodeJS 中不起作用

Node fetch 实现似乎与 Deno 和 Bun 不同,导致网站没有返回响应?

是否可以在 NodeJS 代码库中的每个函数之前和之后添加 console.log?

动态设置元数据,无需重复请求 NextJS 13

Nodejs 从链接数组中获取数据并保存到 mongodb

未捕获的错误: 只能用作 元素的子元素,永远不会直接呈现.请将您的 包裹在

如何防止 Chrome 通过 Selenium 崩溃?

从数据库读取数据并将其作为可下载的 zip 文件发送

JSHint 是否支持异步/等待?

TypeError:winston.Logger 不是带有winston 和morgan 的构造函数

create-react-app,安装错误(找不到命令)

npm install 给出警告,npm audit fix 不起作用

Node.js `--nolazy` 标志是什么意思?

fs.createWriteStream 不会立即创建文件?

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token