Обновление с использованием поля $ in c в mon go дает ошибку - PullRequest
1 голос
/ 07 апреля 2020

Так что я пытаюсь обновить fied в моем БД, чтобы увеличить его каждый раз. как счетчик, так что я продолжаю получать обновленные значения. для этого я использую

var CounterSchema = new Schema({
  _id: String,
  _const: String,
  count: Number
});

, затем я создал свою модель как

const Counter = mongoose.model("counter", CounterSchema);

, затем я использую функцию для обновления поля в моей коллекции, например, следующего ...

async function getNextSequence() {


  var count = await Counter.findOneAndUpdate(
    { _const: "some" },

    { $inc: { count: 1 } },
    { new: true }
  );


  return count.count;
}

Но при запуске вышеуказанной функции я получаю некоторую ошибку. Я убедился, что данный _id существует, и это ошибка, которую я получаю ...

(node:10788) DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify` option set to false are deprecated. See: https://mongoosejs.com/docs/deprecations.html#findandmodify

9:58 PM

{ ValidationError: Url validation failed: counter: Cast to Number failed for value "Promise { <pending> }" at path "counter"

9:58 PM

at ValidationError.inspect (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/error/validation.js:61:24)

9:58 PM

at formatValue (internal/util/inspect.js:493:31)

9:58 PM

at inspect (internal/util/inspect.js:191:10)

9:58 PM

at Object.formatWithOptions (util.js:84:12)

9:58 PM

at Console.(anonymous function) (console.js:191:15)

9:58 PM

at Console.log (console.js:202:31)

9:58 PM

Jump Toat /app/server.js:107:39

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4860:21

9:58 PM

at _done (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3120:16)

9:58 PM

at fn (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3135:18)

9:58 PM

at callbackWrapper (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3089:20)

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4837:16

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4860:21

9:58 PM

at $__save.error (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:489:16)

9:58 PM

errors:

9:58 PM

{ counter:

9:58 PM

{ CastError: Cast to Number failed for value "Promise { <pending> }" at path "counter"

9:58 PM

at new CastError (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/error/cast.js:29:11)

9:58 PM

at model.$set (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/document.js:1233:9)

9:58 PM

at model._handleIndex (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/document.js:972:14)

9:58 PM

У меня есть post api для обновления счетчика. Я сделал две схемы, одну для отслеживания обновлений, а другую для pu sh реального обновленного счета ... в любом случае, я просто пробовал новые вещи. !!

app.post("/api/shorturl/new", function(req, res) {
  var url = req.body.url;
  url = url.replace(/^https?:\/\//, "");
  console.log("url string" + url);

  dns.lookup(url, async function(err, address, family) {
    if (err) {
      return console.log("error in url" + err);
    } else {
      console.log("inside else lookup");

      UrlModel.find({ url: url })
        .then(hello => {
          if (hello.length == 0) {
            console.log("url length is 0");
            console.log("url length is 0" + getNextSequence());

            UrlModel.create({ url: url, counter: getNextSequence() }, function(
              err,
              url
            ) {
              if (err) return console.log(err);
              else return res.json({ success: url });
            });
          } else {
            console.log("not 0");
            //           return the index of the sored file
          }
        })
        .catch(message => {
          console.log("error message catch" + message);
        });


    }
});

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

возвращаемое значение для функции, которую вы написали, является обещанием, потому что после await выполняется строка

return, которая возвращает обещание. Чтобы выполнить это обещание, вы также должны обернуть эту функцию функцией async.

async function run() {
  const sequence = await getNextSequence();
  console.log(sequence);
}

run();

теперь вы получите то, что вы хотели.

0 голосов
/ 07 апреля 2020

Вы определили getNextSequence как асинхронную c функцию, поэтому она автоматически обернется в Обещание. Попробуйте изменить его на:

UrlModel.create({ url: url, counter: await getNextSequence() }, ...
...