Javascript meteor插入函数中的this.userId未返回

Javascript meteor插入函数中的this.userId未返回,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我有以下代码,当我试图获取this.userId时,我似乎无法获取输入到数据库中的值。它通过pub sub在前端工作,不知道如何解决这个问题,如果我使用Meteor.userId(),我会收到一个错误,说它不能在发布函数中使用 import { Meteor } from "meteor/meteor"; import { Accounts } from "meteor/accounts-base"; import { LeadsCollection,

我有以下代码,当我试图获取
this.userId
时,我似乎无法获取输入到数据库中的值。它通过pub sub在前端工作,不知道如何解决这个问题,如果我使用Meteor.userId(),我会收到一个错误,说它不能在发布函数中使用

import { Meteor } from "meteor/meteor";
import { Accounts } from "meteor/accounts-base";
import {
  LeadsCollection,
  LeadsBuilderCollection,
} from "/imports/api/LeadsCollection";
import "/imports/api/leadsMethods";
import "/imports/api/leadsPublications";

const insertLead = (leadEmail) =>
  LeadsCollection.insert({
    email: leadEmail,
    createdAt: new Date(),
    userId: this.userId,
  });
const insertLeadBuilderType = (leadsBuilder) =>
  LeadsBuilderCollection.insert({ type: leadsBuilder });

const SEED_USERNAME = "admin";
const SEED_PASSWORD = "admin";

Meteor.startup(() => {
  if (!Accounts.findUserByUsername(SEED_USERNAME)) {
    Accounts.createUser({
      username: SEED_USERNAME,
      password: SEED_PASSWORD,
    });
  }
  if (LeadsCollection.find().count() === 0) {
    [
      "First Lead",
      "Second Lead",
      "Third Lead",
      "Fourth Lead",
      "Fifth Lead",
      "Sixth Lead",
      "Seventh Lead",
    ].forEach(insertLead);
  }
  if (LeadsBuilderCollection.find().count() === 0) {
    ["Showroom Lead", "Phone Call Lead", "Website Lead"].forEach(
      insertLeadBuilderType
    );
  }
});

this.userId
未以任何方式设置,因为此代码在启动时运行,而不是在对客户端的方法调用或发布的上下文中运行。因此,您需要明确用户ID:

const userId = Accounts.findUserByUsername(SEED_USERNAME)?._id ||
    Accounts.createUser({
      username: SEED_USERNAME,
      password: SEED_PASSWORD,
    });
然后,您需要将该
userId
提供给您的
insertLead
函数,例如:

   ...
    ].forEach(lead => insertLead(lead, userId));
并将功能更改为:

const insertLead = (leadEmail, userId) =>
  LeadsCollection.insert({
    email: leadEmail,
    createdAt: new Date(),
    userId,
  });

旁注。您应该使用Meteor.settings作为种子用户名和默认密码。更好的方法是省略密码并发送邀请电子邮件。值得注意的是,目前它正在开发中,但我要补充一点,在与真人测试之前,用户的id不同是正常的,不同文档的id为1,2,3,4,它们不应该都是相同的用户ID,而且要长得多吗?这部分到底发生了什么
。_ID | |
我知道这是一个or语句和一个if语句,但是上下文中发生了什么。它是说如果用户ID存在,返回这个值,或者如果不返回createUservalue?奇怪的是,当我控制台userId常量时,我得到了正确的userId,但它插入了0,1,2…哦,我在insertLead函数上搞砸了现在一切正常:)