【问题标题】:Azure Function never executes using Mongoose + CosmosDBAzure 函数从不使用 Mongoose + CosmosDB 执行
【发布时间】:2020-02-18 02:42:57
【问题描述】:

我使用 mongoose 制作了一个 azure 函数。我在 local.settings.json 中添加了 cosmosdb 环境变量。我在文件夹中做了 npm init 并安装了以下包。

{
  "name": "signup",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "mongoose": "^5.9.1"
  }
}

当我在云中运行它时,它会挂起大约一分钟,然后什么也没有返回。没有状态码。没有console.log(err)。如果我在本地运行 azure 函数,那么它只会输出:

我正在使用的请求正文

{"email": "bobjones@gmail.com", "password": "Password4$", "username" : "bobjones", "over21": true, "role": "Buyer", "phoneNumber": "7383223333", "fullname": null, "address1": null, "address2": null, "city": null, "state": null, "zip": null, "passwordCreated": null}
LETS SIGNUP
Connection to CosmosDB successful

如果我将它部署到云端进行测试,那么当我运行它时,它会完成,但没有任何输出。没有状态码。 所以它似乎没有出现在 router.post 中,因为 console.log("inside POST") 从未输出过。我开始怀疑这是一个猫鼬兼容性问题,但我不确定。猫鼬对天蓝色功能有限制吗?我只在 google 上看到过一篇关于 mongoose 和 azure 函数的文章,所以我认为它是受支持的,但没有太多文档谈论它。感谢您的帮助!


const express = require("express");
const User = require("./models/user");
const mongoose = require("azure-functions-mongooser");
const mongoose1 = require("mongoose");

const router = express.Router();


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


    mongoose1
        .connect(
            "mongodb://" +
            process.env.COSMOSDB_HOST +
            ":" +
            process.env.COSMOSDB_PORT +
            "/" +
            process.env.COSMOSDB_DBNAME +
            "?ssl=true&replicaSet=globaldb",
            {
                auth: {
                    user: process.env.COSMODDB_USER,
                    password: process.env.COSMOSDB_PASSWORD
                }
            }
        )
        .then(() => console.log("Connection to CosmosDB successful"))
        .catch(err => console.error(err));

            console.log("INSIDE POST")

    router.post("/api/signup", (req, res, next) => {
        console.log("SIGNUP BACKEND");

            const user = new User({
                email: req.body.email,
                password: req.body.password,
                username: req.body.username,
                over21: req.body.over21,
                role: req.body.role,
                phoneNumber: req.body.phoneNumber,
                fullName: req.body.fullName,
                address1: req.body.address1,
                address2: req.body.address2,
                city: req.body.city,
                state: req.body.state,
                zip: req.body.zip,
                passwordCreated: Date.now()
            });
            user
                .save()
                .then(result => {
                    console.log("MADE IT");

                    console.log(result);
                    res.status(201).json({
                        message: "User created!",
                        result: result
                    });
                })
                .catch(err => {
                    let error = err.message;
                    console.log(err);
                     if (error.includes("Error, expected `phoneNumber` to be unique.")) {
                        res.status(500).json({
                            error: "Phone number has already been used"
                        });
                    } else if (error.includes("Error, expected `email` to be unique.")) {
                        res.status(500).json({
                            error: "Email has already been used"
                        });
                    }
                });
        });

};



用户模型

const mongoose = require("mongoose");
//const uniqueValidator = require("mongoose-unique-validator");

const userSchema = mongoose.Schema({
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  username: { type: String, required: true, unique: true },
  over21: { type: String, required: true },
  role: { type: String, required: true },
  fullName: { type: String },
  address1: { type: String },
  phoneNumber: { type: String, required: true, unique: true },
  address2: { type: String },
  city: { type: String },
  state: { type: String },
  zip: { type: String },
  passwordCreated: { type: Date },

});


module.exports = mongoose.model("User", userSchema);


【问题讨论】:

    标签: node.js azure mongoose azure-functions


    【解决方案1】:

    实际上这不是 mongoose 的问题,而是您如何处理代码中的承诺。由于您的导出函数定义为async,因此您的所有承诺都应使用await 关键字等待,否则您的函数将在代码完成执行之前退出,这就是您在控制台中看不到任何日志的原因。 另一方面,代码不会返回您期望的响应,因为它没有正确返回。

    您可以查看Azure Functions Documentation了解更多信息:

    【讨论】:

    • 抱歉回复晚了。我一直在尝试让它工作,但它会超时。我对异步/等待很陌生。我只有使用.then 编写承诺的经验我做了一个示例 azure 函数,它应该可以得到任何日期大于今天的拍卖。我尝试以异步格式编写,但它只是挂起。您提到的我的回调也使用文档现在描述的方式。我不确定问题是什么。你能举个例子来回答你吗? pastebin.com/bBnsJ9vJ
    • 现在等待似乎没问题,但我相信你仍然对如何从函数返回有疑问。只要您的function.json 配置了以下绑定,带有对象的普通返回就应该为您提供所需的结果: { "type": "http", "direction": "out", "name": "$return " }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多