Я работаю над приложением, которое использует стек MERN с паспортом JS для аутентификации.
ERD приложения выглядит следующим образом:
user
site (belongs to user)
page (belongs to site)
Я могу зарегистрироваться, войдите в систему и получите возвращенный идентификатор пользователя и токен:
* {_id: "5db9760b7ba2c21e9a2659f3", email: “test@gmail.com", token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"}
* email: “test@gmail.com"
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
_id: "5db9760b7ba2c21e9a2659f3"
__proto__: Object
Токен сохранен в локальном хранилище.
Теперь я пытаюсь получить следующий шаг в работе ERD:создание сайта. Однако, когда я пытаюсь сделать запрос POST
для сайта, я получаю, что идентификатор пользователя возвращает неопределенное значение:
POST http://localhost:3000/api/users/undefined/sites/ 404 (Not Found)
В терминале я получаю эту ошибку:
(node:24299) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "current" at path "_id" for model "Users"
Экспресс
//Create Site
router.post('/:user_id/sites/:site_id/pages', function (req, res, next) {
const saveData = {
userId: req.params.user_id,
siteId: req.params.site_id,
content: req.body.page.content
};
const condition = {
userId: req.params.user_id,
siteId: req.params.site_id
};
console.log(saveData);
Content.exists(condition)
.then((data) => {
if (data == false) {
Content.create(saveData)
.then((data) => {
res.send(data);
});
}
})
})
РЕАГИРОВАТЬ (api-helper.js)
// LOGIN USER
export const loginUser = async (loginData) => {
const resp = await api.post('/login', { user: loginData });
const token = resp.data.user.token;
storeToken(token);
return (resp)
}
//POST - CREATE SITE
export const newUserSite = async (user_id, data) => {
getToken();
const resp = await api.post(`${user_id}/sites`, { site: data });
return (resp.data);
}
РЕАГИРОВАТЬ (App.js)
async componentDidMount() {
const user = await loginUser();
this.getUserSites();
const allUserSites = await getUserSites();
this.setState({
users: user,
});
console.log(allUserSites);
};
//Create Site
newSite = async (e) => {
e.preventDefault();
const userID = this.state.users.id;
const site = await newUserSite(userID, this.state.formData);
this.setState(prevState => ({
sites: [...prevState.sites, site],
currentSiteId: site.id,
}))
this.props.history.push("/edit")
}
Сесть токен, который возвращается и сохраняется в локальном хранилище, я не могу понять, почему идентификатор пользователя возвращается как неопределенный.