Express.js中的HTTP PUT请求

时间:2018-11-05 14:44:38

标签: javascript node.js express

我正在尝试使用expressjs中项目(/ UpdateTodo /:id)的ID执行PUT请求,但是根据我的代码,我实际上在做的只是添加一组新的json,它可以具有相同的ID。

下面是用于更好理解的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/my_toolbar"
    android:elevation="4dp"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"
    android:minHeight="?android:attr/actionBarSize">

    <LinearLayout
        android:id="@+id/mytoolbar_textlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="vertical">

        <TextView
            android:id="@+id/mytoolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/TextAppearance.Material.Widget.ActionBar.Title"/>
    </LinearLayout>
</android.support.v7.widget.Toolbar>

我的app.post可以正常工作:

public class MyActivity extends AppCompatActivity {

    private Boolean mCurrentValue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.md);
    }

    @Override
    protected void onStart() {
        super.onStart();

        setContentView(R.layout.md);

        SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        Boolean mNewValue = mSharedPreferences.getBoolean("my_preference", false);

        if (mCurrentValue != mNewValue) {
            recreate();
        }

        // ... do other stuff here
        Resources r = getBaseContext().getResources();
        int fourDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, r.getDisplayMetrics());

        final String toolbarColour = "#EE7C0E";

        Toolbar mMasterToolbar = findViewById(R.id.my_toolbar);
        setSupportActionBar(mMasterToolbar);
        mMasterToolbar.setBackgroundColor(Color.parseColor(toolbarColour));
        mMasterToolbar.setElevation(fourDp);
        mMasterToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });


        final TextView mTitle = this.findViewById(R.id.toolbar_1line_title);
        mTitle.setText(getString(R.string.london_overground));

        FragmentMain newFragment = new FragmentMain();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.master_container, newFragment);
        transaction.commit();
    }
}

postman put result

总而言之,我的问题是,如何根据ID更新项目,而不是添加另一个可能具有相同ID的项目?

1 个答案:

答案 0 :(得分:1)

您的PUT请求应在更新之前尝试找到具有相同ID的现有项目。如果不存在,则应创建一个。

例如:

const item = todoList.find(item => item.id === req.params.id);
if (item) { ... }

您可以使用Map来代替使用数组来存储项目(todoList)。进行Map.get()Map.set()可能会使这成为一种有趣的学习体验。

另一个建议就是,您的路线不必用不同的措词。 HTTP方法(PUT,POST等)将使它们唯一,因此代替

  • app.put('/UpdateTodo
  • app.post('/InsertTodo

只需

  • app.put('/todo, function(req, res) { ... });
  • app.post('/todo, function(req, res) { ... });