Как передать параметр в URL с двоеточием на стороне сервера javascript для серверной части NodeJS?

#javascript #html #node.js #forms #url-parameters

#javascript #HTML #node.js #формы #url-параметры

Вопрос:

Я пытаюсь передать числовой идентификатор в качестве параметра в URL на сервер. Что я делаю не так?

У меня есть приложение диспетчера задач, в котором для чтения задачи пользователи могут читать задачу по ее идентификатору, теперь я передаю это непосредственно в postman, введя идентификатор (5e8b) как:

{{url}}/tasks/5e8b

Но я не смог заставить его работать в браузере, вот мой Html-код :

 <h1>Read Task by Task ID</h1>
    <form id="task-id-form">
        <input type="text" id="task-id"><br> <br>
        <button id="task-id-button">Find Task</button>
        <p id="task-id-display"></p>
    </form>
  

И мой JS-код на стороне сервера (который не работает) :

 
const readTaskForm = document.querySelector( "#task-id-form" );
readTaskForm.addEventListener( "submit", ( e ) => {
    const readTaskId = document.querySelector( "#task-id" ).value;
    const params = { id: readTaskId }; // new addition
    const urlParams = new URLSearchParams( Object.entries( readTaskId ) );

    fetch( "http://localhost:3000/tasks/"   urlParams, {
        method: 'get',
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json',
            "Authorization": `Bearer`   `${ inMemoryToken }`
        }
    } ).then( res => res.json() )
        .then( res => {
            console.log( res );
           
        }
        );
} );

  

И мой код js серверного узла имеет вид (который корректно работает в postman):

 router.get( "/tasks/:id", auth, async ( req, res ) => {
    const _id = req.params.id;
    try {
        const task = await Task.findOne( { _id, owner: req.user._id } );
        if ( !task ) {
            return res.status( 401 ).send( { error: "Task id not found" } );
        }
        res.send( { task } );
    } catch ( e ) {
        res.status( 400 ).send( e );
    }
} );
  

Любая помощь высоко ценится.

Комментарии:

1. Если вы сформируете свой URL следующим образом: ‘{{url}}/tasks/id=5e8b’, что произойдет?

2. Извините, URL в браузере выглядит так: localhost:3000/tasks/5e8b

3. Я не думаю, что это работает с id = 5e8b

4. извините, да, мне нужно перечитать ваш вопрос

5. пожалуйста, определите «не работает» и «заставьте это работать». какое конкретное поведение отображается и какие сообщения об ошибках вы видите в инструментах вашего браузера или в консоли вашего сервера?

Ответ №1:

Я думаю, вам не обязательно использовать URLSearchParams в качестве параметра, просто используйте readTaskId

         const readTaskForm = document.querySelector("#task-id-form");
        readTaskForm.addEventListener("submit", (e) => {
          const readTaskId = document.querySelector("#task-id").value;
          //const params = { id: readTaskId }; // new addition

          //const urlParams = new URLSearchParams(Object.entries(readTaskId));
          fetch("http://localhost:3000/tasks/"   readTaskId, {
            method: "get",
            headers: {
              Accept: "application/json, text/plain, */*",
              "Content-Type": "application/json",
              Authorization: `Bearer`   `${inMemoryToken}`
            }
          })
            .then((res) => res.json())
            .then((res) => {
              console.log(res);
            });
        });
  

Комментарии:

1. Выдает ошибку — 400 Неверный запрос в строке ` fetch( » localhost: 3000 / tasks » readTaskId, { `

2. устанавливаете ли вы косую черту в конце «задач»? ` fetch( «localhost: 3000/tasks/» readTaskId, { ` . покажите нам оповещение или консоль. журнал конечного URL (с параметром тоже)

3. Да, я ставлю косую черту в конце URL как fetch( "http://localhost:3000/tasks/" readTaskId, { и у меня есть свой маршрут в серверной части как: router.get( "/tasks/:id", auth, async ( req, res ) => { Кроме того, ваш веб-сайт Blahbox хорошо разработан 🙂

4. Спасибо за Blahbox!. Вы должны отправить нам дополнительную информацию об ошибке. Ошибка полной консоли, какой-то скриншот…. Возможно, у вашего заголовка возникла какая-то проблема.

5. Привет, Матиас, вот скриншот консоли: ibb.co/gVdrczb