Next. js API Routing - PullRequest
       16

Next. js API Routing

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

Надеемся получить помощь от кого-то, кто знаком с Next. js. У меня проблема с преобразованием моих express API-маршрутов в Next. js внутренние API-маршруты на страницах, что выглядит действительно многообещающе. Проблема в том, что он не работает с моими моделями и методами mon goose.

Например:

не работает:

 const doc = await UserModel.findOne({ email: 'josh.mcdaniel@gmail.com' })

работает:

const doc = await req.db
    .collection('users')
    .findOne({ email: 'josh.mcdaniel@gmail.com' }) 

не работает:

const doc = await req.db
    .collection('users')
    .find()

Не уверен, что я просто делаю это неправильно или у меня что-то неправильно настроено. Надеюсь на некоторую помощь. Моя пользовательская модель для справки:

const mongoose = require('mongoose')

const UserSchema = new mongoose.Schema({
  fullName: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
  },
  userName: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  posts: {
    type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'foodPost' }],
  },
  saves: {
    type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'foodPost' }],
  },
  photo: {
    type: String,
    default: 'https://via.placeholder.com/400',
  },
  followingCount: {
    type: Number,
    default: 0,
  },
  followerCount: {
    type: Number,
    default: 0,
  },
  following: {
    type: Array,
    default: [],
  },
  followers: {
    type: Array,
    default: [],
  },
  startDate: {
    type: Date,
    default: Date.now(),
  },
  notifications: {
    type: Array,
    default: [],
  },
})
export default mongoose.models.user || mongoose.model('user', UserSchema)

Пришлось изменить экспорт, чтобы он перестал выдавать ошибку перезаписи.

Спасибо!

1 Ответ

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

Попробуйте сделать так ... (эта запись немного длинная, но если вы следуете логике c и порядку импорта, она должна работать):

Пример структуры проекта:

├── .next
|
├── database
|   └── index.js
|
├── models
|   ├── all.js
|   ├── index.js
|   └── teams.js
|
├── src
|   └── pages
|       ├── api
|       |   └── teams
|       |       └── names.js
|       └── index.js
|
└── next.config.json

база данных / индекс. js - это устанавливает sh соединение с mon go базой данных с использованием mon goose

const bluebird = require("bluebird");
const mongoose = require("mongoose");

// I use process.env.DATABASE as a flexible database name
// this can be set in an ".env" file or in your package.json scripts...
// like "dev" : "DATABASE=example-dev next dev"
const { DATABASE } = process.env;

const options = {
    useNewUrlParser: true, // avoids DeprecationWarning: current URL string parser is deprecated
    useCreateIndex: true, // avoids DeprecationWarning: collection.ensureIndex is deprecated.
    useFindAndModify: false, // avoids DeprecationWarning: collection.findAndModify is deprecated.
    useUnifiedTopology: true, // avoids DeprecationWarning: current Server Discovery and Monitoring engine is deprecated
};

// connects to a mongodb database
mongoose.connect(`mongodb://localhost/${DATABASE}`, options); 

// uses bluebird for mongoose promises
mongoose.Promise = bluebird; 

моделей / все. js - для этого потребуется всех моделей быть зарегистрированным к базе данных подключение

require("./team");
require("./user");
...etc

модели / индекс. js - это будет экспорт mon goose модель экземпляры (вам не нужен этот файл, так как вы можете просто импортировать mongoose и извлечь model(Team) из файла, но я хотел бы уменьшить количество повторяющихся импортов )

const { model } = require("mongoose");

module.exports = {
    Team: model("Team"),
    User: model("User"),
    ...etc
};

моделей / команд. js - это будет устанавливаем sh схему как мон goose модель

const { Schema, model } = require("mongoose");

const teamSchema = new Schema({
    league: { type: String, required: true },
    team: { type: String, unique: true },
    name: { type: String, unique: true, lowercase: true },
});

module.exports = model("Team", teamSchema);

страницы / API / команды / все. js - импортировать модель * 105 4 * экземпляр изнутри маршрута API ...

import { Team } from "../../../models"; (index.js)
// alternatively: 
// import { model } from "mongoose";
// cost Team = model("Team");

/**
 * Retrieves all teams names.
 *
 * @function getAllTeamNames
 * @returns {object} - names
 * @throws {string}
 */
const getAllTeamNames = async (_, res) => {
    // aggregates all team "names" into a single array, like so:
    // [{ names: ["team1,"team2","team3","team4", ...etc] }]

    const teams = await Team.aggregate([
        { $group: { _id: null, names: { $addToSet: "$team" } } },
        { $unwind: "$names" },
        { $sort: { names: 1 } },
        { $group: { _id: null, names: { $push: "$names" } } },
        { $project: { _id: 0, names: 1 } },
    ]); 

    // returns "names" array (["team1,"team2","team3","team4", ...etc])
    res.status(200).json({ names: teams[0].names });
};

export default getAllTeamNames;

next.config. js - это установит sh пул соединений и зарегистрирует модели до следующей загрузки

require("./database"); // establishes the mongo connection
require("./models/all"); // registers the models to the connection

...etc
...