Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.09.2020, 23:04
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

todo list операции save/delete/update/fetch
мне нужно закончить server.js чтобы проект заработал. у меня получилось только часть выполнить. остались операции в конце fetch update delete Save, помогите пожалуйста

server.js
const express = require("express");
const app = express();
const cors = require("cors");
const session = require("express-session");
const cookieParser = require("cookie-parser");

const whitelist = ['http://localhost', 
                   'http://localhost:3000', 
                   'http://localhost:80'];

const corsOptions = {
  credentials: true, 
  origin: (origin, callback) => {
      console.log(origin);
      if ( whitelist.includes(origin) ) {
          return callback(null, true)
      }
      callback(new Error('Not allowed by CORS'));
  }
}

app.use(cors());
app.set('trust proxy', 1)

app.use(session({
    secret: "Wok Tow3l",
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true }
  }));

  var sess = {
    secret: 'Wok Tow3l',
    cookie: {}
    }

    sess.cookie.secure = true // serve secure cookies
app.use(session(sess))

app.use(session({ secret: 'Wok Tow3l', cookie: { maxAge: 60000 }}))

app.use(cookieParser());

app.get('/ping', function (req, res, next) {
    res.send('target ' + req.session + ' ');

    req.sess.destroy(function(err) {

        })
        })
app.post('/ping',(req,res) => {
    sess = req.session;
    sess.cookie = req.target;
    res.end('done');
    });
            
    app.use('/', router);

app.get("/ping", (req, res) => {
    res.send('Pong!');
});

/* Save a new Todo */
app.post("/save/:target", (req, resp) => {

});

/* Fetch the list of :target Todo item(s) */
app.get("/get/:target", (req, resp) => {
    // You need to complete this
});

/* update a Todo */
app.put("/:target/:id", (req, resp) => {
    // You need to complete this
});

/* delete a Todo  */
app.delete("/:target/:id", (req, resp) => {
    // You need to complete this
});


const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Todo (server) is listening at http://localhost:${port}`);
});

Последний раз редактировалось Ulyana1992, 21.09.2020 в 23:10.
Ответить с цитированием
  #2 (permalink)  
Старый 21.09.2020, 23:07
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

прикрепляю index.html todo.js
index.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="icon" type="image/png" href="images/favicon-16x16.png">
    <title>Todo</title>
    <link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/pure-min.css">
    <link rel="stylesheet" href="styles/style.css"/>
    <script type="module">
        import { Todo } from "./modules/todo.js";
        const _todo = new Todo();
    </script>
  </head>
  <body>
      <main>
          <section title="Today" class="todoContainer">
            <header>
                <h1>Today</h1>
                <img class="icon" title="Add Item" width="36" height="36" src="images/plus.png"/>
            </header><div class="msg"></div>
            <ul></ul>
        </section> 
        <section title="Tomorrow" class="todoContainer">
            <header>
                <h1>Tomorrow</h1>
                <img class="icon" title="Add Item" width="36" height="36" src="images/plus.png"/>
            </header>
            <div class="msg"></div>
            <ul></ul>
        </section>
        <section title="Future" class="todoContainer">
            <header>
                <h1>Future</h1>
                <img class="icon" title="Add Item" width="36" height="36" src="images/plus.png"/>
                
            </header>
            <div class="msg"></div>
            <ul>
                <li>
                    <span>Test this out it is even longer...</span>
                    <img class="icon" width="36" height="36" src="images/minus.png"/>
                    <img class="icon" width="36" height="36" src="images/mom.png"/>
                </li>
            </ul>
        </section>
    </main>
  </body>
</html>


todo.js
class Todo {
    constructor() {
        this.NO_ELEMENT_FOUND = true;
        this.NO_CHILDREN = true;

        /* A list of the main containers we have in the application */
        this.targets = ['Today','Tomorrow','Future'];

        window.addEventListener("DOMContentLoaded", (event) => {
            // Setup the onclick callbacks for each Todo list 'Add' button.
            this.targets.forEach((target) => {
                const iconElem = document.querySelector(`section[title='${target}'] img[title='Add Item']`);
                iconElem.addEventListener("click", event => {
                    this.addTodoItem(target);
                });
            });
        });
    }

    /* Each target Todo list has a message div that you can display something into.  
     * Use this method to do only that. 
     * 
     * @target The Todo section DOM element to load
     * @message The message you want to display
     */
    updateMessageOn(target, message = "") {
        const ele = document.querySelector(`section[title='${target}'] > header + div.msg`);
        if ( !ele ) {
            console.error(`${MESSAGES.en_US.NO_ELEMENT_FOUND} on ${target} for updateMessageOn(target)`); 
        }
        ele.innerHTML = message;
    }

    /* Gets the main section you want ('Today', "Tomorrow" or "Future") 
     *
     * @returns NULL if the target cannot be found in the DOM 
     */
    getTodoContainerElement(target = "") {
        const todoSectionEle = document.querySelector(`section[title='${target}']`);
        if ( !todoSectionEle ) {
            console.error(`${MESSAGES.en_US.NO_ELEMENT_FOUND} on ${target} for getTodoContainerElement(target)`);
            return null;
        } 
        return todoSectionEle;
    }
    /* Get the unordered list element within your target Todo.
     *
     * @target The Todo section DOM element to load
     * @return A unordered list element, or NULL if not found
     */
    getTodoListFor(target) {
        const listEle = document.querySelector(`section[title='${target}'] ul`);
        if ( !listEle ) {
            console.error(`${MESSAGES.en_US.NO_ELEMENT_FOUND} on ${target} for getTodoListFor(target)`);
            return null;
        } 
        return listEle;
    }

    /* Adds a new Todo item, if there isn't pending new one's going on right now.
     *
     * @target The Todo section DOM element to load
     */
    addTodoItem(target) {
        if ( this.doesTargetTodoHaveUnsavedItem(target) ) {
            this.updateMessageOn(target, "Finish the previous one you created first...");
            window.setTimeout( () => {
                this.updateMessageOn(target);
            }, 1400);
            return;
        }
        const newHtml = 
            `<li unsaved="true" id="${target}_${Date.now()}>
                <textarea placeholder="Just tab out to save" class="todoItem" onchange="_todo.save(${target}/></textarea>
                <img class="icon" width="20" height="20" src="images/save_36x36.png"/>
            </li>`;
        this.getTodoListFor(target).innerHTML += newHtml;
    }

    /* Utility method to look for any unsaved list items in a target Todo list.
     *
     * @target The Todo section DOM element to load
     * @return false - if there are no unsaved list items;  true here are unsaved items...
     */
    doesTargetTodoHaveUnsavedItem(target) {
        let hasSavedItem = false;

        /** See [url]https://bit.ly/3hsgFbo[/url] for HTMLCollection.  It is not an Array by default.. */
        let coll = Array.from(this.getTodoListFor(target).children);

        coll.forEach((child) => {
            if ( child.getAttribute("unsaved")) {
                hasSavedItem = true;
            }
        });
        return hasSavedItem;
    }

    /* Checks the containers (Today, Tomorrow & Future).      */
    /* They should always exist.   If not returns FALSE.      */
    /* They could be empty.  That is expected.  Returns FALSE */
    /* Only returns TRUE when element exists and has kids.    */
    isListEmpty(target = "Today") {
        const targetList = 
            document.querySelector(`[title ^= '${target}']`);
        if ( !targetElement ) {
            console.error(`Expected parent node (today, tomorrow, future).  It is not in the DOM.`);
            return this.NO_ELEMENT_FOUND;
        }
        const children = targetList.children;
        if ( !children || children.length === 0 ) {
            return this.NO_CHILDREN;
        }
        return true;
    }
    addActions(target) {
        if ( !target) {
            console.error("Cannot add actions on NULL target");
            return;
        }

    }
}

const MESSAGES = {
    en_US : {
        NO_ELEMENT_FOUND: "The expected DOM element was not found.",
        NO_CHILDREN: ""
    }
}

export { Todo };
Ответить с цитированием
  #3 (permalink)  
Старый 22.09.2020, 17:12
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

Сообщение от Rise Посмотреть сообщение
А похоже просто на копипаст. Какое у вас задание?
Rise, написать эти фунцкии
/* Save a new Todo */
app.post("/save/:target", (req, resp) => {

    

});

/* Fetch the list of :target Todo item(s) */
app.get("/get/:target", (req, resp) => {
    // You need to complete this
});

/* update a Todo */
app.put("/:target/:id", (req, resp) => {
    // You need to complete this
});

/* delete a Todo  */
app.delete("/:target/:id", (req, resp) => {
    // You need to complete this
});


и еще express-session который вроде получилось сделать

Последний раз редактировалось Ulyana1992, 22.09.2020 в 17:18.
Ответить с цитированием
  #4 (permalink)  
Старый 23.09.2020, 22:25
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

Rise,
подскажите в каком направлении двигаться?
Ответить с цитированием
  #5 (permalink)  
Старый 24.09.2020, 21:17
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

Rise,
Интерфейс и исходный код были созданы как для вашего пользовательского интерфейса, так и для работы сервера NodeJS с этим приложением. Ваша задача - заполнить недостающие части; Такие как:

1. Редактирование (или обновление ..) существующего элемента Todo.

2. Сохранение / удаление элемента Todo

Для этого приложения нет БД. Вам нужно создать литерал объекта для хранения только в рамках сеанса пользователя. Форма объекта должна напоминать этот пример ниже:

let data =. [

{

id: << уникальный идентификатор из пользовательского интерфейса. Не генерируется сервером.

description: << это то, что клиент вставляет для задачи в пользовательском интерфейсе

date_deleted: << Если вы поместите здесь дату, она будет удалена. Если null, то не удаляется.

type: << это "Today", "Tomorrow" или "Future"

},

{...},

{...},

]

Когда пользовательский интерфейс загружается впервые, вам нужно получить все элементы Todo с сервера (если есть ...). И визуализируйте их в соответствующем контейнере.

Мы используем обработку Express Session. Итак, если вы закроете страницу и вернетесь, она должна загрузить данные с вашего сервера.

Последний раз редактировалось Ulyana1992, 24.09.2020 в 21:20.
Ответить с цитированием
  #6 (permalink)  
Старый 26.09.2020, 10:03
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

Ulyana1992,
Про модуль express-session можно почитать на npm. Там написано, что для хранения данных есть специальное свойство req.session. Поэтому ваш массив данных let data = [...], можно представить как req.session.data = [...]. Еще там сказано, что с версии 1.5.0, модуль cookie-parser не нужен. И что cookie: { secure: true } работает с https, но не с http. И так далее. Про модуль cors тоже интересно почитать. Про модуль express можно что-то узнать на его сайте, например, что "/:target/:id" значит req.params, а req.body требуется express.json() или express.urlencoded(). Вообще, есть шаблон express приложения, там какие-то базовые вещи уже сделаны. Но у вас структура папок и файлов какая-то другая, неизвестно зачем. Про сетевые запросы, это fetch(), здесь что-то похожее для вашего задания. В остальном, если не справитесь, написал в личку.
Ответить с цитированием
  #7 (permalink)  
Старый 29.09.2020, 07:03
Интересующийся
Отправить личное сообщение для Ulyana1992 Посмотреть профиль Найти все сообщения от Ulyana1992
 
Регистрация: 28.04.2020
Сообщений: 13

Rise,
поздно увидела, нo спасибо за материал
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с ToDo list 2.0) dewembas Общие вопросы Javascript 1 25.07.2020 00:32
Помогите с ToDo list dewembas Общие вопросы Javascript 7 20.07.2020 20:32
To do list на js кнопки Clear all и Done all(+localStorage) Dethlike Общие вопросы Javascript 10 10.05.2019 15:10
Проблема в работе с тегами html zeraid Общие вопросы Javascript 16 11.05.2011 18:23
разное время выполнения операции ropowek Events/DOM/Window 2 08.10.2008 13:27